(function () {
    /**
     * Create a cached version of a pure function.
     * @param {*} fn The function call to be cached
     * @void
     */

    function cached(fn) {
        var cache = Object.create(null);
        return function (str) {
            var key = isPrimitive(str) ? str : JSON.stringify(str);
            var hit = cache[key];
            return hit || (cache[key] = fn(str));
        };
    }

    /**
     * Hyphenate a camelCase string.
     */
    var hyphenate = cached(function (str) {
        return str.replace(/([A-Z])/g, function (m) { return '-' + m.toLowerCase(); });
    });

    var hasOwn = Object.prototype.hasOwnProperty;

    /**
     * Simple Object.assign polyfill
     * @param {Object} to The object to be merged with
     * @returns {Object} The merged object
     */
    var merge =
        Object.assign ||
        function (to) {
            var arguments$1 = arguments;

            for (var i = 1; i < arguments.length; i++) {
                var from = Object(arguments$1[i]);

                for (var key in from) {
                    if (hasOwn.call(from, key)) {
                        to[key] = from[key];
                    }
                }
            }

            return to;
        };

    /**
     * Check if value is primitive
     * @param {*} value Checks if a value is primitive
     * @returns {Boolean} Result of the check
     */
    function isPrimitive(value) {
        return typeof value === 'string' || typeof value === 'number';
    }

    /**
     * Performs no operation.
     * @void
     */
    function noop() {}

    /**
     * Check if value is function
     * @param {*} obj Any javascript object
     * @returns {Boolean} True if the passed-in value is a function
     */
    function isFn(obj) {
        return typeof obj === 'function';
    }

    /**
     * Check if url is external
     * @param {String} string  url
     * @returns {Boolean} True if the passed-in url is external
     */
    function isExternal(url) {
        var match = url.match(
            /^([^:/?#]+:)?(?:\/{2,}([^/?#]*))?([^?#]+)?(\?[^#]*)?(#.*)?/
        );

        if (
            typeof match[1] === 'string' &&
            match[1].length > 0 &&
            match[1].toLowerCase() !== location.protocol
        ) {
            return true;
        }
        if (
            typeof match[2] === 'string' &&
            match[2].length > 0 &&
            match[2].replace(
                new RegExp(
                    ':(' + { 'http:': 80, 'https:': 443 }[location.protocol] + ')?$'
                ),
                ''
            ) !== location.host
        ) {
            return true;
        }
        return false;
    }

    var inBrowser = !false;

    var isMobile =  document.body.clientWidth <= 600;

    /**
     * @see https://github.com/MoOx/pjax/blob/master/lib/is-supported.js
     */
    var supportsPushState =

        (function () {
            // Borrowed wholesale from https://github.com/defunkt/jquery-pjax
            return (
                window.history &&
                window.history.pushState &&
                window.history.replaceState &&
                // PushState isn’t reliable on iOS until 5.
                !navigator.userAgent.match(
                    /((iPod|iPhone|iPad).+\bOS\s+[1-4]\D|WebApps\/.+CFNetwork)/
                )
            );
        })();

    var cacheNode = {};

    /**
     * Get Node
     * @param  {String|Element} el A DOM element
     * @param  {Boolean} noCache Flag to use or not use the cache
     * @return {Element} The found node element
     */
    function getNode(el, noCache) {
        if ( noCache === void 0 ) noCache = false;

        if (typeof el === 'string') {
            if (typeof window.Vue !== 'undefined') {
                return find(el);
            }

            el = noCache ? find(el) : cacheNode[el] || (cacheNode[el] = find(el));
        }

        return el;
    }

    var $ =  document;

    var body =  $.body;

    var head =  $.head;

    /**
     * Find elements
     * @param {String|Element} el The root element where to perform the search from
     * @param {Element} node The query
     * @returns {Element} The found DOM element
     * @example
     * find('nav') => document.querySelector('nav')
     * find(nav, 'a') => nav.querySelector('a')
     */
    function find(el, node) {
        return node ? el.querySelector(node) : $.querySelector(el);
    }

    /**
     * Find all elements
     * @param {String|Element} el The root element where to perform the search from
     * @param {Element} node The query
     * @returns {Array<Element>} An array of DOM elements
     * @example
     * findAll('a') => [].slice.call(document.querySelectorAll('a'))
     * findAll(nav, 'a') => [].slice.call(nav.querySelectorAll('a'))
     */
    function findAll(el, node) {
        return [].slice.call(
            node ? el.querySelectorAll(node) : $.querySelectorAll(el)
        );
    }

    function create(node, tpl) {
        node = $.createElement(node);
        if (tpl) {
            node.innerHTML = tpl;
        }

        return node;
    }

    function appendTo(target, el) {
        return target.appendChild(el);
    }

    function before(target, el) {
        return target.insertBefore(el, target.children[0]);
    }

    function on(el, type, handler) {
        isFn(type)
            ? window.addEventListener(el, type)
            : el.addEventListener(type, handler);
    }

    function off(el, type, handler) {
        isFn(type)
            ? window.removeEventListener(el, type)
            : el.removeEventListener(type, handler);
    }

    /**
     * Toggle class
     * @param {String|Element} el The element that needs the class to be toggled
     * @param {Element} type The type of action to be performed on the classList (toggle by default)
     * @param {String} val Name of the class to be toggled
     * @void
     * @example
     * toggleClass(el, 'active') => el.classList.toggle('active')
     * toggleClass(el, 'add', 'active') => el.classList.add('active')
     */
    function toggleClass(el, type, val) {
        el && el.classList[val ? type : 'toggle'](val || type);
    }

    function style(content) {
        appendTo(head, create('style', content));
    }

    /**
     * Fork https://github.com/bendrucker/document-ready/blob/master/index.js
     * @param {Function} callback The callbacack to be called when the page is loaded
     * @returns {Number|void} If the page is already laoded returns the result of the setTimeout callback,
     *  otherwise it only attaches the callback to the DOMContentLoaded event
     */
    function documentReady(callback, doc) {
        if ( doc === void 0 ) doc = document;

        var state = doc.readyState;

        if (state === 'complete' || state === 'interactive') {
            return setTimeout(callback, 0);
        }

        doc.addEventListener('DOMContentLoaded', callback);
    }

    var dom = /*#__PURE__*/Object.freeze({
        __proto__: null,
        getNode: getNode,
        $: $,
        body: body,
        head: head,
        find: find,
        findAll: findAll,
        create: create,
        appendTo: appendTo,
        before: before,
        on: on,
        off: off,
        toggleClass: toggleClass,
        style: style,
        documentReady: documentReady
    });

    function startsWith(str, prefix) {
        return str.indexOf(prefix) === 0;
    }

    function endsWith(str, suffix) {
        return str.indexOf(suffix, str.length - suffix.length) !== -1;
    }

    var decode = decodeURIComponent;
    var encode = encodeURIComponent;

    function parseQuery(query) {
        var res = {};

        query = query.trim().replace(/^(\?|#|&)/, '');

        if (!query) {
            return res;
        }

        // Simple parse
        query.split('&').forEach(function (param) {
            var parts = param.replace(/\+/g, ' ').split('=');

            res[parts[0]] = parts[1] && decode(parts[1]);
        });

        return res;
    }

    function stringifyQuery(obj, ignores) {
        if ( ignores === void 0 ) ignores = [];

        var qs = [];

        for (var key in obj) {
            if (ignores.indexOf(key) > -1) {
                continue;
            }

            qs.push(
                obj[key]
                    ? ((encode(key)) + "=" + (encode(obj[key]))).toLowerCase()
                    : encode(key)
            );
        }

        return qs.length ? ("?" + (qs.join('&'))) : '';
    }

    var isAbsolutePath = cached(function (path) {
        return /(:|(\/{2}))/g.test(path);
    });

    var removeParams = cached(function (path) {
        return path.split(/[?#]/)[0];
    });

    var getParentPath = cached(function (path) {
        if (/\/$/g.test(path)) {
            return path;
        }

        var matchingParts = path.match(/(\S*\/)[^/]+$/);
        return matchingParts ? matchingParts[1] : '';
    });

    var cleanPath = cached(function (path) {
        return path.replace(/^\/+/, '/').replace(/([^:])\/{2,}/g, '$1/');
    });

    var resolvePath = cached(function (path) {
        var segments = path.replace(/^\//, '').split('/');
        var resolved = [];
        for (var i = 0, len = segments.length; i < len; i++) {
            var segment = segments[i];
            if (segment === '..') {
                resolved.pop();
            } else if (segment !== '.') {
                resolved.push(segment);
            }
        }

        return '/' + resolved.join('/');
    });

    /**
     * Normalises the URI path to handle the case where Docsify is
     * hosted off explicit files, i.e. /index.html. This function
     * eliminates any path segments that contain `#` fragments.
     *
     * This is used to map browser URIs to markdown file sources.
     *
     * For example:
     *
     * http://example.org/base/index.html#/blah
     *
     * would be mapped to:
     *
     * http://example.org/base/blah.md.
     *
     * See here for more information:
     *
     * https://github.com/docsifyjs/docsify/pull/1372
     *
     * @param {string} path The URI path to normalise
     * @return {string} { path, query }
     */

    function normaliseFragment(path) {
        return path
            .split('/')
            .filter(function (p) { return p.indexOf('#') === -1; })
            .join('/');
    }

    function getPath() {
        var args = [], len = arguments.length;
        while ( len-- ) args[ len ] = arguments[ len ];

        return cleanPath(args.map(normaliseFragment).join('/'));
    }

    var replaceSlug = cached(function (path) {
        return path.replace('#', '?id=');
    });

    var cached$1 = {};

    function getAlias(path, alias, last) {
        var match = Object.keys(alias).filter(function (key) {
            var re = cached$1[key] || (cached$1[key] = new RegExp(("^" + key + "$")));
            return re.test(path) && path !== last;
        })[0];

        return match
            ? getAlias(path.replace(cached$1[match], alias[match]), alias, path)
            : path;
    }

    function getFileName(path, ext) {
        return new RegExp(("\\.(" + (ext.replace(/^\./, '')) + "|html)$"), 'g').test(path)
            ? path
            : /\/$/g.test(path)
                ? (path + "README" + ext)
                : ("" + path + ext);
    }

    var History = function History(config) {
        this.config = config;
    };

    History.prototype.getBasePath = function getBasePath () {
        return this.config.basePath;
    };

    History.prototype.getFile = function getFile (path, isRelative) {
        if ( path === void 0 ) path = this.getCurrentPath();

        var ref = this;
        var config = ref.config;
        var base = this.getBasePath();
        var ext = typeof config.ext === 'string' ? config.ext : '.md';

        path = config.alias ? getAlias(path, config.alias) : path;
        path = getFileName(path, ext);
        path = path === ("/README" + ext) ? config.homepage || path : path;
        path = isAbsolutePath(path) ? path : getPath(base, path);

        if (isRelative) {
            path = path.replace(new RegExp(("^" + base)), '');
        }

        return path;
    };

    History.prototype.onchange = function onchange (cb) {
        if ( cb === void 0 ) cb = noop;

        cb();
    };

    History.prototype.getCurrentPath = function getCurrentPath () {};

    History.prototype.normalize = function normalize () {};

    History.prototype.parse = function parse () {};

    History.prototype.toURL = function toURL (path, params, currentRoute) {
        var local = currentRoute && path[0] === '#';
        var route = this.parse(replaceSlug(path));

        route.query = merge({}, route.query, params);
        path = route.path + stringifyQuery(route.query);
        path = path.replace(/\.md(\?)|\.md$/, '$1');

        if (local) {
            var idIndex = currentRoute.indexOf('?');
            path =
                (idIndex > 0 ? currentRoute.substring(0, idIndex) : currentRoute) +
                path;
        }

        if (this.config.relativePath && path.indexOf('/') !== 0) {
            var currentDir = currentRoute.substring(
                0,
                currentRoute.lastIndexOf('/') + 1
            );
            return cleanPath(resolvePath(currentDir + path));
        }

        return cleanPath('/' + path);
    };

    function replaceHash(path) {
        var i = location.href.indexOf('#');
        location.replace(location.href.slice(0, i >= 0 ? i : 0) + '#' + path);
    }
    var HashHistory = /*@__PURE__*/(function (History) {
        function HashHistory(config) {
            History.call(this, config);
            this.mode = 'hash';
        }

        if ( History ) HashHistory.__proto__ = History;
        HashHistory.prototype = Object.create( History && History.prototype );
        HashHistory.prototype.constructor = HashHistory;

        HashHistory.prototype.getBasePath = function getBasePath () {
            var path = window.location.pathname || '';
            var base = this.config.basePath;

            // This handles the case where Docsify is served off an
            // explicit file path, i.e.`/base/index.html#/blah`. This
            // prevents the `/index.html` part of the URI from being
            // remove during routing.
            // See here: https://github.com/docsifyjs/docsify/pull/1372
            var basePath = endsWith(path, '.html')
                ? path + '#/' + base
                : path + '/' + base;
            return /^(\/|https?:)/g.test(base) ? base : cleanPath(basePath);
        };

        HashHistory.prototype.getCurrentPath = function getCurrentPath () {
            // We can't use location.hash here because it's not
            // consistent across browsers - Firefox will pre-decode it!
            var href = location.href;
            var index = href.indexOf('#');
            return index === -1 ? '' : href.slice(index + 1);
        };

        /** @param {((params: {source: TODO}) => void)} [cb] */
        HashHistory.prototype.onchange = function onchange (cb) {
            if ( cb === void 0 ) cb = noop;

            // The hashchange event does not tell us if it originated from
            // a clicked link or by moving back/forward in the history;
            // therefore we set a `navigating` flag when a link is clicked
            // to be able to tell these two scenarios apart
            var navigating = false;

            on('click', function (e) {
                var el = e.target.tagName === 'A' ? e.target : e.target.parentNode;

                if (el && el.tagName === 'A' && !/_blank/.test(el.target)) {
                    navigating = true;
                }
            });

            on('hashchange', function (e) {
                var source = navigating ? 'navigate' : 'history';
                navigating = false;
                cb({ event: e, source: source });
            });
        };

        HashHistory.prototype.normalize = function normalize () {
            var path = this.getCurrentPath();

            path = replaceSlug(path);

            if (path.charAt(0) === '/') {
                return replaceHash(path);
            }

            replaceHash('/' + path);
        };

        /**
         * Parse the url
         * @param {string} [path=location.herf] URL to be parsed
         * @return {object} { path, query }
         */
        HashHistory.prototype.parse = function parse (path) {
            if ( path === void 0 ) path = location.href;

            var query = '';

            var hashIndex = path.indexOf('#');
            if (hashIndex >= 0) {
                path = path.slice(hashIndex + 1);
            }

            var queryIndex = path.indexOf('?');
            if (queryIndex >= 0) {
                query = path.slice(queryIndex + 1);
                path = path.slice(0, queryIndex);
            }

            return {
                path: path,
                file: this.getFile(path, true),
                query: parseQuery(query),
            };
        };

        HashHistory.prototype.toURL = function toURL (path, params, currentRoute) {
            return '#' + History.prototype.toURL.call(this, path, params, currentRoute);
        };

        return HashHistory;
    }(History));

    /** @typedef {any} TODO */

    var HTML5History = /*@__PURE__*/(function (History) {
        function HTML5History(config) {
            History.call(this, config);
            this.mode = 'history';
        }

        if ( History ) HTML5History.__proto__ = History;
        HTML5History.prototype = Object.create( History && History.prototype );
        HTML5History.prototype.constructor = HTML5History;

        HTML5History.prototype.getCurrentPath = function getCurrentPath () {
            var base = this.getBasePath();
            var path = window.location.pathname;

            if (base && path.indexOf(base) === 0) {
                path = path.slice(base.length);
            }

            return (path || '/') + window.location.search + window.location.hash;
        };

        HTML5History.prototype.onchange = function onchange (cb) {
            var this$1 = this;
            if ( cb === void 0 ) cb = noop;

            on('click', function (e) {
                var el = e.target.tagName === 'A' ? e.target : e.target.parentNode;

                if (el && el.tagName === 'A' && !/_blank/.test(el.target)) {
                    e.preventDefault();
                    var url = el.href;
                    // solve history.pushState cross-origin issue
                    if (this$1.config.crossOriginLinks.indexOf(url) !== -1) {
                        window.open(url, '_self');
                    } else {
                        window.history.pushState({ key: url }, '', url);
                    }
                    cb({ event: e, source: 'navigate' });
                }
            });

            on('popstate', function (e) {
                cb({ event: e, source: 'history' });
            });
        };

        /**
         * Parse the url
         * @param {string} [path=location.href] URL to be parsed
         * @return {object} { path, query }
         */
        HTML5History.prototype.parse = function parse (path) {
            if ( path === void 0 ) path = location.href;

            var query = '';

            var queryIndex = path.indexOf('?');
            if (queryIndex >= 0) {
                query = path.slice(queryIndex + 1);
                path = path.slice(0, queryIndex);
            }

            var base = getPath(location.origin);
            var baseIndex = path.indexOf(base);

            if (baseIndex > -1) {
                path = path.slice(baseIndex + base.length);
            }

            return {
                path: path,
                file: this.getFile(path),
                query: parseQuery(query),
            };
        };

        return HTML5History;
    }(History));

    /**
     * @typedef {{
     *   path?: string
     * }} Route
     */

    /** @type {Route} */
    var lastRoute = {};

    /** @typedef {import('../Docsify').Constructor} Constructor */

    /**
     * @template {!Constructor} T
     * @param {T} Base - The class to extend
     */
    function Router(Base) {
        return /*@__PURE__*/(function (Base) {
            function Router() {
                var args = [], len = arguments.length;
                while ( len-- ) args[ len ] = arguments[ len ];

                Base.apply(this, args);

                this.route = {};
            }

            if ( Base ) Router.__proto__ = Base;
            Router.prototype = Object.create( Base && Base.prototype );
            Router.prototype.constructor = Router;

            Router.prototype.updateRender = function updateRender () {
                this.router.normalize();
                this.route = this.router.parse();
                body.setAttribute('data-page', this.route.file);
            };

            Router.prototype.initRouter = function initRouter () {
                var this$1 = this;

                var config = this.config;
                var mode = config.routerMode || 'hash';
                var router;

                if (mode === 'history' && supportsPushState) {
                    router = new HTML5History(config);
                } else {
                    router = new HashHistory(config);
                }

                this.router = router;
                this.updateRender();
                lastRoute = this.route;

                // eslint-disable-next-line no-unused-vars
                router.onchange(function (params) {
                    this$1.updateRender();
                    this$1._updateRender();

                    if (lastRoute.path === this$1.route.path) {
                        this$1.$resetEvents(params.source);
                        return;
                    }

                    this$1.$fetch(noop, this$1.$resetEvents.bind(this$1, params.source));
                    lastRoute = this$1.route;
                });
            };

            return Router;
        }(Base));
    }

    var RGX = /([^{]*?)\w(?=\})/g;

    var MAP = {
        YYYY: 'getFullYear',
        YY: 'getYear',
        MM: function (d) {
            return d.getMonth() + 1;
        },
        DD: 'getDate',
        HH: 'getHours',
        mm: 'getMinutes',
        ss: 'getSeconds',
        fff: 'getMilliseconds'
    };

    function tinydate (str, custom) {
        var parts=[], offset=0;

        str.replace(RGX, function (key, _, idx) {
            // save preceding string
            parts.push(str.substring(offset, idx - 1));
            offset = idx += key.length + 1;
            // save function
            parts.push(custom && custom[key] || function (d) {
                return ('00' + (typeof MAP[key] === 'string' ? d[MAP[key]]() : MAP[key](d))).slice(-key.length);
            });
        });

        if (offset !== str.length) {
            parts.push(str.substring(offset));
        }

        return function (arg) {
            var out='', i=0, d=arg||new Date();
            for (; i<parts.length; i++) {
                out += (typeof parts[i]==='string') ? parts[i] : parts[i](d);
            }
            return out;
        };
    }

    var barEl;
    var timeId;

    /**
     * Init progress component
     */
    function init() {
        var div = create('div');

        div.classList.add('progress');
        appendTo(body, div);
        barEl = div;
    }

    /**
     * Render progress bar
     */
    function progressbar (ref) {
        var loaded = ref.loaded;
        var total = ref.total;
        var step = ref.step;

        var num;

        !barEl && init();

        if (step) {
            num = parseInt(barEl.style.width || 0, 10) + step;
            num = num > 80 ? 80 : num;
        } else {
            num = Math.floor((loaded / total) * 100);
        }

        barEl.style.opacity = 1;
        barEl.style.width = num >= 95 ? '100%' : num + '%';

        if (num >= 95) {
            clearTimeout(timeId);
            // eslint-disable-next-line no-unused-vars
            timeId = setTimeout(function (_) {
                barEl.style.opacity = 0;
                barEl.style.width = '0%';
            }, 200);
        }
    }

    /* eslint-disable no-unused-vars */

    var cache = {};

    /**
     * Ajax GET implmentation
     * @param {string} url Resource URL
     * @param {boolean} [hasBar=false] Has progress bar
     * @param {String[]} headers Array of headers
     * @return {Promise} Promise response
     */
    function get(url, hasBar, headers) {
        if ( hasBar === void 0 ) hasBar = false;
        if ( headers === void 0 ) headers = {};

        var xhr = new XMLHttpRequest();
        var on = function () {
            xhr.addEventListener.apply(xhr, arguments);
        };

        var cached = cache[url];

        if (cached) {
            return { then: function (cb) { return cb(cached.content, cached.opt); }, abort: noop };
        }

        xhr.open('GET', url);
        for (var i in headers) {
            if (hasOwn.call(headers, i)) {
                xhr.setRequestHeader(i, headers[i]);
            }
        }

        xhr.send();

        return {
            then: function (success, error) {
                if ( error === void 0 ) error = noop;

                if (hasBar) {
                    var id = setInterval(
                        function (_) { return progressbar({
                            step: Math.floor(Math.random() * 5 + 1),
                        }); },
                        500
                    );

                    on('progress', progressbar);
                    on('loadend', function (evt) {
                        progressbar(evt);
                        clearInterval(id);
                    });
                }

                on('error', error);
                on('load', function (ref) {
                    var target = ref.target;

                    if (target.status >= 400) {
                        error(target);
                    } else {
                        var result = (cache[url] = {
                            content: target.response,
                            opt: {
                                updatedAt: xhr.getResponseHeader('last-modified'),
                            },
                        });

                        success(result.content, result.opt);
                    }
                });
            },
            abort: function (_) { return xhr.readyState !== 4 && xhr.abort(); },
        };
    }

    function replaceVar(block, color) {
        block.innerHTML = block.innerHTML.replace(
            /var\(\s*--theme-color.*?\)/g,
            color
        );
    }

    function cssVars (color) {
        // Variable support
        if (window.CSS && window.CSS.supports && window.CSS.supports('(--v:red)')) {
            return;
        }

        var styleBlocks = findAll('style:not(.inserted),link');
        [].forEach.call(styleBlocks, function (block) {
            if (block.nodeName === 'STYLE') {
                replaceVar(block, color);
            } else if (block.nodeName === 'LINK') {
                var href = block.getAttribute('href');

                if (!/\.css$/.test(href)) {
                    return;
                }

                get(href).then(function (res) {
                    var style = create('style', res);

                    head.appendChild(style);
                    replaceVar(style, color);
                });
            }
        });
    }

    /* eslint-disable no-unused-vars */

    var title = $.title;
    /**
     * Toggle button
     * @param {Element} el Button to be toggled
     * @void
     */
    function btn(el) {
        var toggle = function (_) { return body.classList.toggle('close'); };

        el = getNode(el);
        if (el === null || el === undefined) {
            return;
        }

        on(el, 'click', function (e) {
            e.stopPropagation();
            toggle();
        });

        isMobile &&
        on(
            body,
            'click',
            function (_) { return body.classList.contains('close') && toggle(); }
        );
    }

    function collapse(el) {
        el = getNode(el);
        if (el === null || el === undefined) {
            return;
        }

        on(el, 'click', function (ref) {
            var target = ref.target;

            if (
                target.nodeName === 'A' &&
                target.nextSibling &&
                target.nextSibling.classList &&
                target.nextSibling.classList.contains('app-sub-sidebar')
            ) {
                toggleClass(target.parentNode, 'collapse');
            }
        });
    }

    function sticky() {
        var cover = getNode('section.cover');
        if (!cover) {
            return;
        }

        var coverHeight = cover.getBoundingClientRect().height;

        if (window.pageYOffset >= coverHeight || cover.classList.contains('hidden')) {
            toggleClass(body, 'add', 'sticky');
        } else {
            toggleClass(body, 'remove', 'sticky');
        }
    }

    /**
     * Get and active link
     * @param  {Object} router Router
     * @param  {String|Element} el Target element
     * @param  {Boolean} isParent Active parent
     * @param  {Boolean} autoTitle Automatically set title
     * @return {Element} Active element
     */
    function getAndActive(router, el, isParent, autoTitle) {
        el = getNode(el);
        var links = [];
        if (el !== null && el !== undefined) {
            links = findAll(el, 'a');
        }

        var hash = decodeURI(router.toURL(router.getCurrentPath()));
        var target;

        links
            .sort(function (a, b) { return b.href.length - a.href.length; })
            .forEach(function (a) {
                var href = decodeURI(a.getAttribute('href'));
                var node = isParent ? a.parentNode : a;

                a.title = a.title || a.innerText;

                if (hash.indexOf(href) === 0 && !target) {
                    target = a;
                    toggleClass(node, 'add', 'active');
                } else {
                    toggleClass(node, 'remove', 'active');
                }
            });

        if (autoTitle) {
            $.title = target
                ? target.title || ((target.innerText) + " - " + title)
                : title;
        }

        return target;
    }

    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }();

    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

    var SingleTweener = function () {
        function SingleTweener() {
            var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

            _classCallCheck(this, SingleTweener);

            this.start = opts.start;
            this.end = opts.end;
            this.decimal = opts.decimal;
        }

        _createClass(SingleTweener, [{
            key: "getIntermediateValue",
            value: function getIntermediateValue(tick) {
                if (this.decimal) {
                    return tick;
                } else {
                    return Math.round(tick);
                }
            }
        }, {
            key: "getFinalValue",
            value: function getFinalValue() {
                return this.end;
            }
        }]);

        return SingleTweener;
    }();

    var _createClass$1 = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }();

    function _classCallCheck$1(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

    var Tweezer = function () {
        function Tweezer() {
            var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

            _classCallCheck$1(this, Tweezer);

            this.duration = opts.duration || 1000;
            this.ease = opts.easing || this._defaultEase;
            this.tweener = opts.tweener || new SingleTweener(opts);
            this.start = this.tweener.start;
            this.end = this.tweener.end;

            this.frame = null;
            this.next = null;
            this.isRunning = false;
            this.events = {};
            this.direction = this.start < this.end ? 'up' : 'down';
        }

        _createClass$1(Tweezer, [{
            key: 'begin',
            value: function begin() {
                if (!this.isRunning && this.next !== this.end) {
                    this.frame = window.requestAnimationFrame(this._tick.bind(this));
                }
                return this;
            }
        }, {
            key: 'stop',
            value: function stop() {
                window.cancelAnimationFrame(this.frame);
                this.isRunning = false;
                this.frame = null;
                this.timeStart = null;
                this.next = null;
                return this;
            }
        }, {
            key: 'on',
            value: function on(name, handler) {
                this.events[name] = this.events[name] || [];
                this.events[name].push(handler);
                return this;
            }
        }, {
            key: '_emit',
            value: function _emit(name, val) {
                var _this = this;

                var e = this.events[name];
                e && e.forEach(function (handler) {
                    return handler.call(_this, val);
                });
            }
        }, {
            key: '_tick',
            value: function _tick(currentTime) {
                this.isRunning = true;

                var lastTick = this.next || this.start;

                if (!this.timeStart) { this.timeStart = currentTime; }
                this.timeElapsed = currentTime - this.timeStart;
                this.next = this.ease(this.timeElapsed, this.start, this.end - this.start, this.duration);

                if (this._shouldTick(lastTick)) {
                    this._emit('tick', this.tweener.getIntermediateValue(this.next));
                    this.frame = window.requestAnimationFrame(this._tick.bind(this));
                } else {
                    this._emit('tick', this.tweener.getFinalValue());
                    this._emit('done', null);
                }
            }
        }, {
            key: '_shouldTick',
            value: function _shouldTick(lastTick) {
                return {
                    up: this.next < this.end && lastTick <= this.next,
                    down: this.next > this.end && lastTick >= this.next
                }[this.direction];
            }
        }, {
            key: '_defaultEase',
            value: function _defaultEase(t, b, c, d) {
                if ((t /= d / 2) < 1) { return c / 2 * t * t + b; }
                return -c / 2 * (--t * (t - 2) - 1) + b;
            }
        }]);

        return Tweezer;
    }();

    var currentScript = document.currentScript;

    /** @param {import('./Docsify').Docsify} vm */
    function config (vm) {
        var config = merge(
            {
                auto2top: false,
                autoHeader: false,
                basePath: '',
                catchPluginErrors: true,
                cornerExternalLinkTarget: '_blank',
                coverpage: '',
                crossOriginLinks: [],
                el: '#app',
                executeScript: null,
                ext: '.md',
                externalLinkRel: 'noopener',
                externalLinkTarget: '_blank',
                formatUpdated: '',
                ga: '',
                homepage: 'README.md',
                loadNavbar: null,
                loadSidebar: null,
                maxLevel: 6,
                mergeNavbar: false,
                name: '',
                nameLink: window.location.pathname,
                nativeEmoji: false,
                noCompileLinks: [],
                noEmoji: false,
                notFoundPage: true,
                relativePath: false,
                repo: '',
                routes: {},
                routerMode: 'hash',
                subMaxLevel: 0,
                themeColor: '',
                topMargin: 0,
            },
            typeof window.$docsify === 'function'
                ? window.$docsify(vm)
                : window.$docsify
        );

        var script =
            currentScript ||
            [].slice
                .call(document.getElementsByTagName('script'))
                .filter(function (n) { return /docsify\./.test(n.src); })[0];

        if (script) {
            for (var prop in config) {
                if (hasOwn.call(config, prop)) {
                    var val = script.getAttribute('data-' + hyphenate(prop));

                    if (isPrimitive(val)) {
                        config[prop] = val === '' ? true : val;
                    }
                }
            }
        }

        if (config.loadSidebar === true) {
            config.loadSidebar = '_sidebar' + config.ext;
        }

        if (config.loadNavbar === true) {
            config.loadNavbar = '_navbar' + config.ext;
        }

        if (config.coverpage === true) {
            config.coverpage = '_coverpage' + config.ext;
        }

        if (config.repo === true) {
            config.repo = '';
        }

        if (config.name === true) {
            config.name = '';
        }

        window.$docsify = config;

        return config;
    }

    var nav = {};
    var hoverOver = false;
    var scroller = null;
    var enableScrollEvent = true;
    var coverHeight = 0;

    function scrollTo(el, offset) {
        if ( offset === void 0 ) offset = 0;

        if (scroller) {
            scroller.stop();
        }

        enableScrollEvent = false;
        scroller = new Tweezer({
            start: window.pageYOffset,
            end:
                Math.round(el.getBoundingClientRect().top) + window.pageYOffset - offset,
            duration: 500,
        })
            .on('tick', function (v) { return window.scrollTo(0, v); })
            .on('done', function () {
                enableScrollEvent = true;
                scroller = null;
            })
            .begin();
    }

    function highlight(path) {
        if (!enableScrollEvent) {
            return;
        }

        var sidebar = getNode('.sidebar');
        var anchors = findAll('.anchor');
        var wrap = find(sidebar, '.sidebar-nav');
        var active = find(sidebar, 'li.active');
        var doc = document.documentElement;
        var top = ((doc && doc.scrollTop) || document.body.scrollTop) - coverHeight;
        var last;

        for (var i = 0, len = anchors.length; i < len; i += 1) {
            var node = anchors[i];

            if (node.offsetTop > top) {
                if (!last) {
                    last = node;
                }

                break;
            } else {
                last = node;
            }
        }

        if (!last) {
            return;
        }

        var li = nav[getNavKey(path, last.getAttribute('data-id'))];

        if (!li || li === active) {
            return;
        }

        active && active.classList.remove('active');
        li.classList.add('active');
        active = li;

        // Scroll into view
        // https://github.com/vuejs/vuejs.org/blob/master/themes/vue/source/js/common.js#L282-L297
        if (!hoverOver && body.classList.contains('sticky')) {
            var height = sidebar.clientHeight;
            var curOffset = 0;
            var cur = active.offsetTop + active.clientHeight + 40;
            var isInView =
                active.offsetTop >= wrap.scrollTop && cur <= wrap.scrollTop + height;
            var notThan = cur - curOffset < height;

            sidebar.scrollTop = isInView
                ? wrap.scrollTop
                : notThan
                    ? curOffset
                    : cur - height;
        }
    }

    function getNavKey(path, id) {
        return ((decodeURIComponent(path)) + "?id=" + (decodeURIComponent(id)));
    }

    function scrollActiveSidebar(router) {
        var cover = find('.cover.show');
        coverHeight = cover ? cover.offsetHeight : 0;

        var sidebar = getNode('.sidebar');
        var lis = [];
        if (sidebar !== null && sidebar !== undefined) {
            lis = findAll(sidebar, 'li');
        }

        for (var i = 0, len = lis.length; i < len; i += 1) {
            var li = lis[i];
            var a = li.querySelector('a');
            if (!a) {
                continue;
            }

            var href = a.getAttribute('href');

            if (href !== '/') {
                var ref = router.parse(href);
                var id = ref.query.id;
                var path$1 = ref.path;
                if (id) {
                    href = getNavKey(path$1, id);
                }
            }

            if (href) {
                nav[decodeURIComponent(href)] = li;
            }
        }

        if (isMobile) {
            return;
        }

        var path = removeParams(router.getCurrentPath());
        off('scroll', function () { return highlight(path); });
        on('scroll', function () { return highlight(path); });
        on(sidebar, 'mouseover', function () {
            hoverOver = true;
        });
        on(sidebar, 'mouseleave', function () {
            hoverOver = false;
        });
    }

    function scrollIntoView(path, id) {
        if (!id) {
            return;
        }
        var topMargin = config().topMargin;
        var section = find('#' + id);
        section && scrollTo(section, topMargin);

        var li = nav[getNavKey(path, id)];
        var sidebar = getNode('.sidebar');
        var active = find(sidebar, 'li.active');
        active && active.classList.remove('active');
        li && li.classList.add('active');
    }

    var scrollEl = $.scrollingElement || $.documentElement;

    function scroll2Top(offset) {
        if ( offset === void 0 ) offset = 0;

        scrollEl.scrollTop = offset === true ? 0 : Number(offset);
    }

    var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};

    function createCommonjsModule(fn, module) {
        return module = { exports: {} }, fn(module, module.exports), module.exports;
    }

    var defaults = createCommonjsModule(function (module) {
        function getDefaults() {
            return {
                baseUrl: null,
                breaks: false,
                gfm: true,
                headerIds: true,
                headerPrefix: '',
                highlight: null,
                langPrefix: 'language-',
                mangle: true,
                pedantic: false,
                renderer: null,
                sanitize: false,
                sanitizer: null,
                silent: false,
                smartLists: false,
                smartypants: false,
                tokenizer: null,
                walkTokens: null,
                xhtml: false
            };
        }

        function changeDefaults(newDefaults) {
            module.exports.defaults = newDefaults;
        }

        module.exports = {
            defaults: getDefaults(),
            getDefaults: getDefaults,
            changeDefaults: changeDefaults
        };
    });
    var defaults_1 = defaults.defaults;
    var defaults_2 = defaults.getDefaults;
    var defaults_3 = defaults.changeDefaults;

    /**
     * Helpers
     */
    var escapeTest = /[&<>"']/;
    var escapeReplace = /[&<>"']/g;
    var escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/;
    var escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g;
    var escapeReplacements = {
        '&': '&amp;',
        '<': '&lt;',
        '>': '&gt;',
        '"': '&quot;',
        "'": '&#39;'
    };
    var getEscapeReplacement = function (ch) { return escapeReplacements[ch]; };
    function escape(html, encode) {
        if (encode) {
            if (escapeTest.test(html)) {
                return html.replace(escapeReplace, getEscapeReplacement);
            }
        } else {
            if (escapeTestNoEncode.test(html)) {
                return html.replace(escapeReplaceNoEncode, getEscapeReplacement);
            }
        }

        return html;
    }

    var unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;

    function unescape(html) {
        // explicitly match decimal, hex, and named HTML entities
        return html.replace(unescapeTest, function (_, n) {
            n = n.toLowerCase();
            if (n === 'colon') { return ':'; }
            if (n.charAt(0) === '#') {
                return n.charAt(1) === 'x'
                    ? String.fromCharCode(parseInt(n.substring(2), 16))
                    : String.fromCharCode(+n.substring(1));
            }
            return '';
        });
    }

    var caret = /(^|[^\[])\^/g;
    function edit(regex, opt) {
        regex = regex.source || regex;
        opt = opt || '';
        var obj = {
            replace: function (name, val) {
                val = val.source || val;
                val = val.replace(caret, '$1');
                regex = regex.replace(name, val);
                return obj;
            },
            getRegex: function () {
                return new RegExp(regex, opt);
            }
        };
        return obj;
    }

    var nonWordAndColonTest = /[^\w:]/g;
    var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
    function cleanUrl(sanitize, base, href) {
        if (sanitize) {
            var prot;
            try {
                prot = decodeURIComponent(unescape(href))
                    .replace(nonWordAndColonTest, '')
                    .toLowerCase();
            } catch (e) {
                return null;
            }
            if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
                return null;
            }
        }
        if (base && !originIndependentUrl.test(href)) {
            href = resolveUrl(base, href);
        }
        try {
            href = encodeURI(href).replace(/%25/g, '%');
        } catch (e) {
            return null;
        }
        return href;
    }

    var baseUrls = {};
    var justDomain = /^[^:]+:\/*[^/]*$/;
    var protocol = /^([^:]+:)[\s\S]*$/;
    var domain = /^([^:]+:\/*[^/]*)[\s\S]*$/;

    function resolveUrl(base, href) {
        if (!baseUrls[' ' + base]) {
            // we can ignore everything in base after the last slash of its path component,
            // but we might need to add _that_
            // https://tools.ietf.org/html/rfc3986#section-3
            if (justDomain.test(base)) {
                baseUrls[' ' + base] = base + '/';
            } else {
                baseUrls[' ' + base] = rtrim(base, '/', true);
            }
        }
        base = baseUrls[' ' + base];
        var relativeBase = base.indexOf(':') === -1;

        if (href.substring(0, 2) === '//') {
            if (relativeBase) {
                return href;
            }
            return base.replace(protocol, '$1') + href;
        } else if (href.charAt(0) === '/') {
            if (relativeBase) {
                return href;
            }
            return base.replace(domain, '$1') + href;
        } else {
            return base + href;
        }
    }

    var noopTest = { exec: function noopTest() {} };

    function merge$1(obj) {
        var arguments$1 = arguments;

        var i = 1,
            target,
            key;

        for (; i < arguments.length; i++) {
            target = arguments$1[i];
            for (key in target) {
                if (Object.prototype.hasOwnProperty.call(target, key)) {
                    obj[key] = target[key];
                }
            }
        }

        return obj;
    }

    function splitCells(tableRow, count) {
        // ensure that every cell-delimiting pipe has a space
        // before it to distinguish it from an escaped pipe
        var row = tableRow.replace(/\|/g, function (match, offset, str) {
                var escaped = false,
                    curr = offset;
                while (--curr >= 0 && str[curr] === '\\') { escaped = !escaped; }
                if (escaped) {
                    // odd number of slashes means | is escaped
                    // so we leave it alone
                    return '|';
                } else {
                    // add space before unescaped |
                    return ' |';
                }
            }),
            cells = row.split(/ \|/);
        var i = 0;

        if (cells.length > count) {
            cells.splice(count);
        } else {
            while (cells.length < count) { cells.push(''); }
        }

        for (; i < cells.length; i++) {
            // leading or trailing whitespace is ignored per the gfm spec
            cells[i] = cells[i].trim().replace(/\\\|/g, '|');
        }
        return cells;
    }

    // Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').
    // /c*$/ is vulnerable to REDOS.
    // invert: Remove suffix of non-c chars instead. Default falsey.
    function rtrim(str, c, invert) {
        var l = str.length;
        if (l === 0) {
            return '';
        }

        // Length of suffix matching the invert condition.
        var suffLen = 0;

        // Step left until we fail to match the invert condition.
        while (suffLen < l) {
            var currChar = str.charAt(l - suffLen - 1);
            if (currChar === c && !invert) {
                suffLen++;
            } else if (currChar !== c && invert) {
                suffLen++;
            } else {
                break;
            }
        }

        return str.substr(0, l - suffLen);
    }

    function findClosingBracket(str, b) {
        if (str.indexOf(b[1]) === -1) {
            return -1;
        }
        var l = str.length;
        var level = 0,
            i = 0;
        for (; i < l; i++) {
            if (str[i] === '\\') {
                i++;
            } else if (str[i] === b[0]) {
                level++;
            } else if (str[i] === b[1]) {
                level--;
                if (level < 0) {
                    return i;
                }
            }
        }
        return -1;
    }

    function checkSanitizeDeprecation(opt) {
        if (opt && opt.sanitize && !opt.silent) {
            console.warn('marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options');
        }
    }

    // copied from https://stackoverflow.com/a/5450113/806777
    function repeatString(pattern, count) {
        if (count < 1) {
            return '';
        }
        var result = '';
        while (count > 1) {
            if (count & 1) {
                result += pattern;
            }
            count >>= 1;
            pattern += pattern;
        }
        return result + pattern;
    }

    var helpers = {
        escape: escape,
        unescape: unescape,
        edit: edit,
        cleanUrl: cleanUrl,
        resolveUrl: resolveUrl,
        noopTest: noopTest,
        merge: merge$1,
        splitCells: splitCells,
        rtrim: rtrim,
        findClosingBracket: findClosingBracket,
        checkSanitizeDeprecation: checkSanitizeDeprecation,
        repeatString: repeatString
    };

    var defaults$1 = defaults.defaults;

    var rtrim$1 = helpers.rtrim;
    var splitCells$1 = helpers.splitCells;
    var escape$1 = helpers.escape;
    var findClosingBracket$1 = helpers.findClosingBracket;

    function outputLink(cap, link, raw) {
        var href = link.href;
        var title = link.title ? escape$1(link.title) : null;
        var text = cap[1].replace(/\\([\[\]])/g, '$1');

        if (cap[0].charAt(0) !== '!') {
            return {
                type: 'link',
                raw: raw,
                href: href,
                title: title,
                text: text
            };
        } else {
            return {
                type: 'image',
                raw: raw,
                href: href,
                title: title,
                text: escape$1(text)
            };
        }
    }

    function indentCodeCompensation(raw, text) {
        var matchIndentToCode = raw.match(/^(\s+)(?:```)/);

        if (matchIndentToCode === null) {
            return text;
        }

        var indentToCode = matchIndentToCode[1];

        return text
            .split('\n')
            .map(function (node) {
                var matchIndentInNode = node.match(/^\s+/);
                if (matchIndentInNode === null) {
                    return node;
                }

                var indentInNode = matchIndentInNode[0];

                if (indentInNode.length >= indentToCode.length) {
                    return node.slice(indentToCode.length);
                }

                return node;
            })
            .join('\n');
    }

    /**
     * Tokenizer
     */
    var Tokenizer = /*@__PURE__*/(function () {
        function Tokenizer(options) {
            this.options = options || defaults$1;
        }

        Tokenizer.prototype.space = function space (src) {
            var cap = this.rules.block.newline.exec(src);
            if (cap) {
                if (cap[0].length > 1) {
                    return {
                        type: 'space',
                        raw: cap[0]
                    };
                }
                return { raw: '\n' };
            }
        };

        Tokenizer.prototype.code = function code (src, tokens) {
            var cap = this.rules.block.code.exec(src);
            if (cap) {
                var lastToken = tokens[tokens.length - 1];
                // An indented code block cannot interrupt a paragraph.
                if (lastToken && lastToken.type === 'paragraph') {
                    return {
                        raw: cap[0],
                        text: cap[0].trimRight()
                    };
                }

                var text = cap[0].replace(/^ {1,4}/gm, '');
                return {
                    type: 'code',
                    raw: cap[0],
                    codeBlockStyle: 'indented',
                    text: !this.options.pedantic
                        ? rtrim$1(text, '\n')
                        : text
                };
            }
        };

        Tokenizer.prototype.fences = function fences (src) {
            var cap = this.rules.block.fences.exec(src);
            if (cap) {
                var raw = cap[0];
                var text = indentCodeCompensation(raw, cap[3] || '');

                return {
                    type: 'code',
                    raw: raw,
                    lang: cap[2] ? cap[2].trim() : cap[2],
                    text: text
                };
            }
        };

        Tokenizer.prototype.heading = function heading (src) {
            var cap = this.rules.block.heading.exec(src);
            if (cap) {
                var text = cap[2].trim();

                // remove trailing #s
                if (/#$/.test(text)) {
                    var trimmed = rtrim$1(text, '#');
                    if (this.options.pedantic) {
                        text = trimmed.trim();
                    } else if (!trimmed || / $/.test(trimmed)) {
                        // CommonMark requires space before trailing #s
                        text = trimmed.trim();
                    }
                }

                return {
                    type: 'heading',
                    raw: cap[0],
                    depth: cap[1].length,
                    text: text
                };
            }
        };

        Tokenizer.prototype.nptable = function nptable (src) {
            var cap = this.rules.block.nptable.exec(src);
            if (cap) {
                var item = {
                    type: 'table',
                    header: splitCells$1(cap[1].replace(/^ *| *\| *$/g, '')),
                    align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
                    cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : [],
                    raw: cap[0]
                };

                if (item.header.length === item.align.length) {
                    var l = item.align.length;
                    var i;
                    for (i = 0; i < l; i++) {
                        if (/^ *-+: *$/.test(item.align[i])) {
                            item.align[i] = 'right';
                        } else if (/^ *:-+: *$/.test(item.align[i])) {
                            item.align[i] = 'center';
                        } else if (/^ *:-+ *$/.test(item.align[i])) {
                            item.align[i] = 'left';
                        } else {
                            item.align[i] = null;
                        }
                    }

                    l = item.cells.length;
                    for (i = 0; i < l; i++) {
                        item.cells[i] = splitCells$1(item.cells[i], item.header.length);
                    }

                    return item;
                }
            }
        };

        Tokenizer.prototype.hr = function hr (src) {
            var cap = this.rules.block.hr.exec(src);
            if (cap) {
                return {
                    type: 'hr',
                    raw: cap[0]
                };
            }
        };

        Tokenizer.prototype.blockquote = function blockquote (src) {
            var cap = this.rules.block.blockquote.exec(src);
            if (cap) {
                var text = cap[0].replace(/^ *> ?/gm, '');

                return {
                    type: 'blockquote',
                    raw: cap[0],
                    text: text
                };
            }
        };

        Tokenizer.prototype.list = function list (src) {
            var cap = this.rules.block.list.exec(src);
            if (cap) {
                var raw = cap[0];
                var bull = cap[2];
                var isordered = bull.length > 1;

                var list = {
                    type: 'list',
                    raw: raw,
                    ordered: isordered,
                    start: isordered ? +bull.slice(0, -1) : '',
                    loose: false,
                    items: []
                };

                // Get each top-level item.
                var itemMatch = cap[0].match(this.rules.block.item);

                var next = false,
                    item,
                    space,
                    bcurr,
                    bnext,
                    addBack,
                    loose,
                    istask,
                    ischecked;

                var l = itemMatch.length;
                bcurr = this.rules.block.listItemStart.exec(itemMatch[0]);
                for (var i = 0; i < l; i++) {
                    item = itemMatch[i];
                    raw = item;

                    // Determine whether the next list item belongs here.
                    // Backpedal if it does not belong in this list.
                    if (i !== l - 1) {
                        bnext = this.rules.block.listItemStart.exec(itemMatch[i + 1]);
                        if (
                            !this.options.pedantic
                                ? bnext[1].length > bcurr[0].length || bnext[1].length > 3
                                : bnext[1].length > bcurr[1].length
                        ) {
                            // nested list
                            itemMatch.splice(i, 2, itemMatch[i] + '\n' + itemMatch[i + 1]);
                            i--;
                            l--;
                            continue;
                        } else {
                            if (
                                // different bullet style
                                !this.options.pedantic || this.options.smartLists
                                    ? bnext[2][bnext[2].length - 1] !== bull[bull.length - 1]
                                    : isordered === (bnext[2].length === 1)
                            ) {
                                addBack = itemMatch.slice(i + 1).join('\n');
                                list.raw = list.raw.substring(0, list.raw.length - addBack.length);
                                i = l - 1;
                            }
                        }
                        bcurr = bnext;
                    }

                    // Remove the list item's bullet
                    // so it is seen as the next token.
                    space = item.length;
                    item = item.replace(/^ *([*+-]|\d+[.)]) ?/, '');

                    // Outdent whatever the
                    // list item contains. Hacky.
                    if (~item.indexOf('\n ')) {
                        space -= item.length;
                        item = !this.options.pedantic
                            ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
                            : item.replace(/^ {1,4}/gm, '');
                    }

                    // Determine whether item is loose or not.
                    // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
                    // for discount behavior.
                    loose = next || /\n\n(?!\s*$)/.test(item);
                    if (i !== l - 1) {
                        next = item.charAt(item.length - 1) === '\n';
                        if (!loose) { loose = next; }
                    }

                    if (loose) {
                        list.loose = true;
                    }

                    // Check for task list items
                    if (this.options.gfm) {
                        istask = /^\[[ xX]\] /.test(item);
                        ischecked = undefined;
                        if (istask) {
                            ischecked = item[1] !== ' ';
                            item = item.replace(/^\[[ xX]\] +/, '');
                        }
                    }

                    list.items.push({
                        type: 'list_item',
                        raw: raw,
                        task: istask,
                        checked: ischecked,
                        loose: loose,
                        text: item
                    });
                }

                return list;
            }
        };

        Tokenizer.prototype.html = function html (src) {
            var cap = this.rules.block.html.exec(src);
            if (cap) {
                return {
                    type: this.options.sanitize
                        ? 'paragraph'
                        : 'html',
                    raw: cap[0],
                    pre: !this.options.sanitizer
                        && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
                    text: this.options.sanitize ? (this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape$1(cap[0])) : cap[0]
                };
            }
        };

        Tokenizer.prototype.def = function def (src) {
            var cap = this.rules.block.def.exec(src);
            if (cap) {
                if (cap[3]) { cap[3] = cap[3].substring(1, cap[3].length - 1); }
                var tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
                return {
                    tag: tag,
                    raw: cap[0],
                    href: cap[2],
                    title: cap[3]
                };
            }
        };

        Tokenizer.prototype.table = function table (src) {
            var cap = this.rules.block.table.exec(src);
            if (cap) {
                var item = {
                    type: 'table',
                    header: splitCells$1(cap[1].replace(/^ *| *\| *$/g, '')),
                    align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
                    cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
                };

                if (item.header.length === item.align.length) {
                    item.raw = cap[0];

                    var l = item.align.length;
                    var i;
                    for (i = 0; i < l; i++) {
                        if (/^ *-+: *$/.test(item.align[i])) {
                            item.align[i] = 'right';
                        } else if (/^ *:-+: *$/.test(item.align[i])) {
                            item.align[i] = 'center';
                        } else if (/^ *:-+ *$/.test(item.align[i])) {
                            item.align[i] = 'left';
                        } else {
                            item.align[i] = null;
                        }
                    }

                    l = item.cells.length;
                    for (i = 0; i < l; i++) {
                        item.cells[i] = splitCells$1(
                            item.cells[i].replace(/^ *\| *| *\| *$/g, ''),
                            item.header.length);
                    }

                    return item;
                }
            }
        };

        Tokenizer.prototype.lheading = function lheading (src) {
            var cap = this.rules.block.lheading.exec(src);
            if (cap) {
                return {
                    type: 'heading',
                    raw: cap[0],
                    depth: cap[2].charAt(0) === '=' ? 1 : 2,
                    text: cap[1]
                };
            }
        };

        Tokenizer.prototype.paragraph = function paragraph (src) {
            var cap = this.rules.block.paragraph.exec(src);
            if (cap) {
                return {
                    type: 'paragraph',
                    raw: cap[0],
                    text: cap[1].charAt(cap[1].length - 1) === '\n'
                        ? cap[1].slice(0, -1)
                        : cap[1]
                };
            }
        };

        Tokenizer.prototype.text = function text (src, tokens) {
            var cap = this.rules.block.text.exec(src);
            if (cap) {
                var lastToken = tokens[tokens.length - 1];
                if (lastToken && lastToken.type === 'text') {
                    return {
                        raw: cap[0],
                        text: cap[0]
                    };
                }

                return {
                    type: 'text',
                    raw: cap[0],
                    text: cap[0]
                };
            }
        };

        Tokenizer.prototype.escape = function escape$1$1 (src) {
            var cap = this.rules.inline.escape.exec(src);
            if (cap) {
                return {
                    type: 'escape',
                    raw: cap[0],
                    text: escape$1(cap[1])
                };
            }
        };

        Tokenizer.prototype.tag = function tag (src, inLink, inRawBlock) {
            var cap = this.rules.inline.tag.exec(src);
            if (cap) {
                if (!inLink && /^<a /i.test(cap[0])) {
                    inLink = true;
                } else if (inLink && /^<\/a>/i.test(cap[0])) {
                    inLink = false;
                }
                if (!inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
                    inRawBlock = true;
                } else if (inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
                    inRawBlock = false;
                }

                return {
                    type: this.options.sanitize
                        ? 'text'
                        : 'html',
                    raw: cap[0],
                    inLink: inLink,
                    inRawBlock: inRawBlock,
                    text: this.options.sanitize
                        ? (this.options.sanitizer
                            ? this.options.sanitizer(cap[0])
                            : escape$1(cap[0]))
                        : cap[0]
                };
            }
        };

        Tokenizer.prototype.link = function link (src) {
            var cap = this.rules.inline.link.exec(src);
            if (cap) {
                var trimmedUrl = cap[2].trim();
                if (!this.options.pedantic && /^</.test(trimmedUrl)) {
                    // commonmark requires matching angle brackets
                    if (!(/>$/.test(trimmedUrl))) {
                        return;
                    }

                    // ending angle bracket cannot be escaped
                    var rtrimSlash = rtrim$1(trimmedUrl.slice(0, -1), '\\');
                    if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {
                        return;
                    }
                } else {
                    // find closing parenthesis
                    var lastParenIndex = findClosingBracket$1(cap[2], '()');
                    if (lastParenIndex > -1) {
                        var start = cap[0].indexOf('!') === 0 ? 5 : 4;
                        var linkLen = start + cap[1].length + lastParenIndex;
                        cap[2] = cap[2].substring(0, lastParenIndex);
                        cap[0] = cap[0].substring(0, linkLen).trim();
                        cap[3] = '';
                    }
                }
                var href = cap[2];
                var title = '';
                if (this.options.pedantic) {
                    // split pedantic href and title
                    var link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);

                    if (link) {
                        href = link[1];
                        title = link[3];
                    }
                } else {
                    title = cap[3] ? cap[3].slice(1, -1) : '';
                }

                href = href.trim();
                if (/^</.test(href)) {
                    if (this.options.pedantic && !(/>$/.test(trimmedUrl))) {
                        // pedantic allows starting angle bracket without ending angle bracket
                        href = href.slice(1);
                    } else {
                        href = href.slice(1, -1);
                    }
                }
                return outputLink(cap, {
                    href: href ? href.replace(this.rules.inline._escapes, '$1') : href,
                    title: title ? title.replace(this.rules.inline._escapes, '$1') : title
                }, cap[0]);
            }
        };

        Tokenizer.prototype.reflink = function reflink (src, links) {
            var cap;
            if ((cap = this.rules.inline.reflink.exec(src))
                || (cap = this.rules.inline.nolink.exec(src))) {
                var link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
                link = links[link.toLowerCase()];
                if (!link || !link.href) {
                    var text = cap[0].charAt(0);
                    return {
                        type: 'text',
                        raw: text,
                        text: text
                    };
                }
                return outputLink(cap, link, cap[0]);
            }
        };

        Tokenizer.prototype.strong = function strong (src, maskedSrc, prevChar) {
            if ( prevChar === void 0 ) prevChar = '';

            var match = this.rules.inline.strong.start.exec(src);

            if (match && (!match[1] || (match[1] && (prevChar === '' || this.rules.inline.punctuation.exec(prevChar))))) {
                maskedSrc = maskedSrc.slice(-1 * src.length);
                var endReg = match[0] === '**' ? this.rules.inline.strong.endAst : this.rules.inline.strong.endUnd;

                endReg.lastIndex = 0;

                var cap;
                while ((match = endReg.exec(maskedSrc)) != null) {
                    cap = this.rules.inline.strong.middle.exec(maskedSrc.slice(0, match.index + 3));
                    if (cap) {
                        return {
                            type: 'strong',
                            raw: src.slice(0, cap[0].length),
                            text: src.slice(2, cap[0].length - 2)
                        };
                    }
                }
            }
        };

        Tokenizer.prototype.em = function em (src, maskedSrc, prevChar) {
            if ( prevChar === void 0 ) prevChar = '';

            var match = this.rules.inline.em.start.exec(src);

            if (match && (!match[1] || (match[1] && (prevChar === '' || this.rules.inline.punctuation.exec(prevChar))))) {
                maskedSrc = maskedSrc.slice(-1 * src.length);
                var endReg = match[0] === '*' ? this.rules.inline.em.endAst : this.rules.inline.em.endUnd;

                endReg.lastIndex = 0;

                var cap;
                while ((match = endReg.exec(maskedSrc)) != null) {
                    cap = this.rules.inline.em.middle.exec(maskedSrc.slice(0, match.index + 2));
                    if (cap) {
                        return {
                            type: 'em',
                            raw: src.slice(0, cap[0].length),
                            text: src.slice(1, cap[0].length - 1)
                        };
                    }
                }
            }
        };

        Tokenizer.prototype.codespan = function codespan (src) {
            var cap = this.rules.inline.code.exec(src);
            if (cap) {
                var text = cap[2].replace(/\n/g, ' ');
                var hasNonSpaceChars = /[^ ]/.test(text);
                var hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);
                if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {
                    text = text.substring(1, text.length - 1);
                }
                text = escape$1(text, true);
                return {
                    type: 'codespan',
                    raw: cap[0],
                    text: text
                };
            }
        };

        Tokenizer.prototype.br = function br (src) {
            var cap = this.rules.inline.br.exec(src);
            if (cap) {
                return {
                    type: 'br',
                    raw: cap[0]
                };
            }
        };

        Tokenizer.prototype.del = function del (src) {
            var cap = this.rules.inline.del.exec(src);
            if (cap) {
                return {
                    type: 'del',
                    raw: cap[0],
                    text: cap[2]
                };
            }
        };

        Tokenizer.prototype.autolink = function autolink (src, mangle) {
            var cap = this.rules.inline.autolink.exec(src);
            if (cap) {
                var text, href;
                if (cap[2] === '@') {
                    text = escape$1(this.options.mangle ? mangle(cap[1]) : cap[1]);
                    href = 'mailto:' + text;
                } else {
                    text = escape$1(cap[1]);
                    href = text;
                }

                return {
                    type: 'link',
                    raw: cap[0],
                    text: text,
                    href: href,
                    tokens: [
                        {
                            type: 'text',
                            raw: text,
                            text: text
                        }
                    ]
                };
            }
        };

        Tokenizer.prototype.url = function url (src, mangle) {
            var cap;
            if (cap = this.rules.inline.url.exec(src)) {
                var text, href;
                if (cap[2] === '@') {
                    text = escape$1(this.options.mangle ? mangle(cap[0]) : cap[0]);
                    href = 'mailto:' + text;
                } else {
                    // do extended autolink path validation
                    var prevCapZero;
                    do {
                        prevCapZero = cap[0];
                        cap[0] = this.rules.inline._backpedal.exec(cap[0])[0];
                    } while (prevCapZero !== cap[0]);
                    text = escape$1(cap[0]);
                    if (cap[1] === 'www.') {
                        href = 'http://' + text;
                    } else {
                        href = text;
                    }
                }
                return {
                    type: 'link',
                    raw: cap[0],
                    text: text,
                    href: href,
                    tokens: [
                        {
                            type: 'text',
                            raw: text,
                            text: text
                        }
                    ]
                };
            }
        };

        Tokenizer.prototype.inlineText = function inlineText (src, inRawBlock, smartypants) {
            var cap = this.rules.inline.text.exec(src);
            if (cap) {
                var text;
                if (inRawBlock) {
                    text = this.options.sanitize ? (this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape$1(cap[0])) : cap[0];
                } else {
                    text = escape$1(this.options.smartypants ? smartypants(cap[0]) : cap[0]);
                }
                return {
                    type: 'text',
                    raw: cap[0],
                    text: text
                };
            }
        };

        return Tokenizer;
    }());

    var noopTest$1 = helpers.noopTest;
    var edit$1 = helpers.edit;
    var merge$2 = helpers.merge;

    /**
     * Block-Level Grammar
     */
    var block = {
        newline: /^(?: *(?:\n|$))+/,
        code: /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,
        fences: /^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,
        hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
        heading: /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,
        blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
        list: /^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?! {0,3}bull )\n*|\s*$)/,
        html: '^ {0,3}(?:' // optional indentation
            + '<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)' // (1)
            + '|comment[^\\n]*(\\n+|$)' // (2)
            + '|<\\?[\\s\\S]*?(?:\\?>\\n*|$)' // (3)
            + '|<![A-Z][\\s\\S]*?(?:>\\n*|$)' // (4)
            + '|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)' // (5)
            + '|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)' // (6)
            + '|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)' // (7) open tag
            + '|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)' // (7) closing tag
            + ')',
        def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
        nptable: noopTest$1,
        table: noopTest$1,
        lheading: /^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,
        // regex template, placeholders will be replaced according to different paragraph
        // interruption rules of commonmark and the original markdown spec:
        _paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html| +\n)[^\n]+)*)/,
        text: /^[^\n]+/
    };

    block._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/;
    block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
    block.def = edit$1(block.def)
        .replace('label', block._label)
        .replace('title', block._title)
        .getRegex();

    block.bullet = /(?:[*+-]|\d{1,9}[.)])/;
    block.item = /^( *)(bull) ?[^\n]*(?:\n(?! *bull ?)[^\n]*)*/;
    block.item = edit$1(block.item, 'gm')
        .replace(/bull/g, block.bullet)
        .getRegex();

    block.listItemStart = edit$1(/^( *)(bull)/)
        .replace('bull', block.bullet)
        .getRegex();

    block.list = edit$1(block.list)
        .replace(/bull/g, block.bullet)
        .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))')
        .replace('def', '\\n+(?=' + block.def.source + ')')
        .getRegex();

    block._tag = 'address|article|aside|base|basefont|blockquote|body|caption'
        + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'
        + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'
        + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'
        + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'
        + '|track|ul';
    block._comment = /<!--(?!-?>)[\s\S]*?(?:-->|$)/;
    block.html = edit$1(block.html, 'i')
        .replace('comment', block._comment)
        .replace('tag', block._tag)
        .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/)
        .getRegex();

    block.paragraph = edit$1(block._paragraph)
        .replace('hr', block.hr)
        .replace('heading', ' {0,3}#{1,6} ')
        .replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs
        .replace('blockquote', ' {0,3}>')
        .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n')
        .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt
        .replace('html', '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)')
        .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks
        .getRegex();

    block.blockquote = edit$1(block.blockquote)
        .replace('paragraph', block.paragraph)
        .getRegex();

    /**
     * Normal Block Grammar
     */

    block.normal = merge$2({}, block);

    /**
     * GFM Block Grammar
     */

    block.gfm = merge$2({}, block.normal, {
        nptable: '^ *([^|\\n ].*\\|.*)\\n' // Header
            + ' {0,3}([-:]+ *\\|[-| :]*)' // Align
            + '(?:\\n((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)', // Cells
        table: '^ *\\|(.+)\\n' // Header
            + ' {0,3}\\|?( *[-:]+[-| :]*)' // Align
            + '(?:\\n *((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)' // Cells
    });

    block.gfm.nptable = edit$1(block.gfm.nptable)
        .replace('hr', block.hr)
        .replace('heading', ' {0,3}#{1,6} ')
        .replace('blockquote', ' {0,3}>')
        .replace('code', ' {4}[^\\n]')
        .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n')
        .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt
        .replace('html', '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)')
        .replace('tag', block._tag) // tables can be interrupted by type (6) html blocks
        .getRegex();

    block.gfm.table = edit$1(block.gfm.table)
        .replace('hr', block.hr)
        .replace('heading', ' {0,3}#{1,6} ')
        .replace('blockquote', ' {0,3}>')
        .replace('code', ' {4}[^\\n]')
        .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n')
        .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt
        .replace('html', '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)')
        .replace('tag', block._tag) // tables can be interrupted by type (6) html blocks
        .getRegex();

    /**
     * Pedantic grammar (original John Gruber's loose markdown specification)
     */

    block.pedantic = merge$2({}, block.normal, {
        html: edit$1(
            '^ *(?:comment *(?:\\n|\\s*$)'
            + '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag
            + '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))')
            .replace('comment', block._comment)
            .replace(/tag/g, '(?!(?:'
                + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'
                + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'
                + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b')
            .getRegex(),
        def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,
        heading: /^(#{1,6})(.*)(?:\n+|$)/,
        fences: noopTest$1, // fences not supported
        paragraph: edit$1(block.normal._paragraph)
            .replace('hr', block.hr)
            .replace('heading', ' *#{1,6} *[^\n]')
            .replace('lheading', block.lheading)
            .replace('blockquote', ' {0,3}>')
            .replace('|fences', '')
            .replace('|list', '')
            .replace('|html', '')
            .getRegex()
    });

    /**
     * Inline-Level Grammar
     */
    var inline = {
        escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
        autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
        url: noopTest$1,
        tag: '^comment'
            + '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
            + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
            + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. <?php ?>
            + '|^<![a-zA-Z]+\\s[\\s\\S]*?>' // declaration, e.g. <!DOCTYPE html>
            + '|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>', // CDATA section
        link: /^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,
        reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
        nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
        reflinkSearch: 'reflink|nolink(?!\\()',
        strong: {
            start: /^(?:(\*\*(?=[*punctuation]))|\*\*)(?![\s])|__/, // (1) returns if starts w/ punctuation
            middle: /^\*\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*\*$|^__(?![\s])((?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?)__$/,
            endAst: /[^punctuation\s]\*\*(?!\*)|[punctuation]\*\*(?!\*)(?:(?=[punctuation_\s]|$))/, // last char can't be punct, or final * must also be followed by punct (or endline)
            endUnd: /[^\s]__(?!_)(?:(?=[punctuation*\s])|$)/ // last char can't be a space, and final _ must preceed punct or \s (or endline)
        },
        em: {
            start: /^(?:(\*(?=[punctuation]))|\*)(?![*\s])|_/, // (1) returns if starts w/ punctuation
            middle: /^\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*$|^_(?![_\s])(?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?_$/,
            endAst: /[^punctuation\s]\*(?!\*)|[punctuation]\*(?!\*)(?:(?=[punctuation_\s]|$))/, // last char can't be punct, or final * must also be followed by punct (or endline)
            endUnd: /[^\s]_(?!_)(?:(?=[punctuation*\s])|$)/ // last char can't be a space, and final _ must preceed punct or \s (or endline)
        },
        code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,
        br: /^( {2,}|\\)\n(?!\s*$)/,
        del: noopTest$1,
        text: /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*]|\b_|$)|[^ ](?= {2,}\n)))/,
        punctuation: /^([\s*punctuation])/
    };

    // list of punctuation marks from common mark spec
    // without * and _ to workaround cases with double emphasis
    inline._punctuation = '!"#$%&\'()+\\-.,/:;<=>?@\\[\\]`^{|}~';
    inline.punctuation = edit$1(inline.punctuation).replace(/punctuation/g, inline._punctuation).getRegex();

    // sequences em should skip over [title](link), `code`, <html>
    inline._blockSkip = '\\[[^\\]]*?\\]\\([^\\)]*?\\)|`[^`]*?`|<[^>]*?>';
    inline._overlapSkip = '__[^_]*?__|\\*\\*\\[^\\*\\]*?\\*\\*';

    inline._comment = edit$1(block._comment).replace('(?:-->|$)', '-->').getRegex();

    inline.em.start = edit$1(inline.em.start)
        .replace(/punctuation/g, inline._punctuation)
        .getRegex();

    inline.em.middle = edit$1(inline.em.middle)
        .replace(/punctuation/g, inline._punctuation)
        .replace(/overlapSkip/g, inline._overlapSkip)
        .getRegex();

    inline.em.endAst = edit$1(inline.em.endAst, 'g')
        .replace(/punctuation/g, inline._punctuation)
        .getRegex();

    inline.em.endUnd = edit$1(inline.em.endUnd, 'g')
        .replace(/punctuation/g, inline._punctuation)
        .getRegex();

    inline.strong.start = edit$1(inline.strong.start)
        .replace(/punctuation/g, inline._punctuation)
        .getRegex();

    inline.strong.middle = edit$1(inline.strong.middle)
        .replace(/punctuation/g, inline._punctuation)
        .replace(/overlapSkip/g, inline._overlapSkip)
        .getRegex();

    inline.strong.endAst = edit$1(inline.strong.endAst, 'g')
        .replace(/punctuation/g, inline._punctuation)
        .getRegex();

    inline.strong.endUnd = edit$1(inline.strong.endUnd, 'g')
        .replace(/punctuation/g, inline._punctuation)
        .getRegex();

    inline.blockSkip = edit$1(inline._blockSkip, 'g')
        .getRegex();

    inline.overlapSkip = edit$1(inline._overlapSkip, 'g')
        .getRegex();

    inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;

    inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
    inline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;
    inline.autolink = edit$1(inline.autolink)
        .replace('scheme', inline._scheme)
        .replace('email', inline._email)
        .getRegex();

    inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;

    inline.tag = edit$1(inline.tag)
        .replace('comment', inline._comment)
        .replace('attribute', inline._attribute)
        .getRegex();

    inline._label = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/;
    inline._href = /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/;
    inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;

    inline.link = edit$1(inline.link)
        .replace('label', inline._label)
        .replace('href', inline._href)
        .replace('title', inline._title)
        .getRegex();

    inline.reflink = edit$1(inline.reflink)
        .replace('label', inline._label)
        .getRegex();

    inline.reflinkSearch = edit$1(inline.reflinkSearch, 'g')
        .replace('reflink', inline.reflink)
        .replace('nolink', inline.nolink)
        .getRegex();

    /**
     * Normal Inline Grammar
     */

    inline.normal = merge$2({}, inline);

    /**
     * Pedantic Inline Grammar
     */

    inline.pedantic = merge$2({}, inline.normal, {
        strong: {
            start: /^__|\*\*/,
            middle: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
            endAst: /\*\*(?!\*)/g,
            endUnd: /__(?!_)/g
        },
        em: {
            start: /^_|\*/,
            middle: /^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,
            endAst: /\*(?!\*)/g,
            endUnd: /_(?!_)/g
        },
        link: edit$1(/^!?\[(label)\]\((.*?)\)/)
            .replace('label', inline._label)
            .getRegex(),
        reflink: edit$1(/^!?\[(label)\]\s*\[([^\]]*)\]/)
            .replace('label', inline._label)
            .getRegex()
    });

    /**
     * GFM Inline Grammar
     */

    inline.gfm = merge$2({}, inline.normal, {
        escape: edit$1(inline.escape).replace('])', '~|])').getRegex(),
        _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,
        url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,
        _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
        del: /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,
        text: /^([`~]+|[^`~])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*~]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))/
    });

    inline.gfm.url = edit$1(inline.gfm.url, 'i')
        .replace('email', inline.gfm._extended_email)
        .getRegex();
    /**
     * GFM + Line Breaks Inline Grammar
     */

    inline.breaks = merge$2({}, inline.gfm, {
        br: edit$1(inline.br).replace('{2,}', '*').getRegex(),
        text: edit$1(inline.gfm.text)
            .replace('\\b_', '\\b_| {2,}\\n')
            .replace(/\{2,\}/g, '*')
            .getRegex()
    });

    var rules = {
        block: block,
        inline: inline
    };

    var defaults$2 = defaults.defaults;

    var block$1 = rules.block;
    var inline$1 = rules.inline;

    var repeatString$1 = helpers.repeatString;

    /**
     * smartypants text replacement
     */
    function smartypants(text) {
        return text
            // em-dashes
            .replace(/---/g, '\u2014')
            // en-dashes
            .replace(/--/g, '\u2013')
            // opening singles
            .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
            // closing singles & apostrophes
            .replace(/'/g, '\u2019')
            // opening doubles
            .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
            // closing doubles
            .replace(/"/g, '\u201d')
            // ellipses
            .replace(/\.{3}/g, '\u2026');
    }

    /**
     * mangle email addresses
     */
    function mangle(text) {
        var out = '',
            i,
            ch;

        var l = text.length;
        for (i = 0; i < l; i++) {
            ch = text.charCodeAt(i);
            if (Math.random() > 0.5) {
                ch = 'x' + ch.toString(16);
            }
            out += '&#' + ch + ';';
        }

        return out;
    }

    /**
     * Block Lexer
     */
    var Lexer = /*@__PURE__*/(function () {
        function Lexer(options) {
            this.tokens = [];
            this.tokens.links = Object.create(null);
            this.options = options || defaults$2;
            this.options.tokenizer = this.options.tokenizer || new Tokenizer();
            this.tokenizer = this.options.tokenizer;
            this.tokenizer.options = this.options;

            var rules = {
                block: block$1.normal,
                inline: inline$1.normal
            };

            if (this.options.pedantic) {
                rules.block = block$1.pedantic;
                rules.inline = inline$1.pedantic;
            } else if (this.options.gfm) {
                rules.block = block$1.gfm;
                if (this.options.breaks) {
                    rules.inline = inline$1.breaks;
                } else {
                    rules.inline = inline$1.gfm;
                }
            }
            this.tokenizer.rules = rules;
        }

        var staticAccessors = { rules: { configurable: true } };

        /**
         * Expose Rules
         */
        staticAccessors.rules.get = function () {
            return {
                block: block$1,
                inline: inline$1
            };
        };

        /**
         * Static Lex Method
         */
        Lexer.lex = function lex (src, options) {
            var lexer = new Lexer(options);
            return lexer.lex(src);
        };

        /**
         * Static Lex Inline Method
         */
        Lexer.lexInline = function lexInline (src, options) {
            var lexer = new Lexer(options);
            return lexer.inlineTokens(src);
        };

        /**
         * Preprocessing
         */
        Lexer.prototype.lex = function lex (src) {
            src = src
                .replace(/\r\n|\r/g, '\n')
                .replace(/\t/g, '    ');

            this.blockTokens(src, this.tokens, true);

            this.inline(this.tokens);

            return this.tokens;
        };

        /**
         * Lexing
         */
        Lexer.prototype.blockTokens = function blockTokens (src, tokens, top) {
            if ( tokens === void 0 ) tokens = [];
            if ( top === void 0 ) top = true;

            if (this.options.pedantic) {
                src = src.replace(/^ +$/gm, '');
            }
            var token, i, l, lastToken;

            while (src) {
                // newline
                if (token = this.tokenizer.space(src)) {
                    src = src.substring(token.raw.length);
                    if (token.type) {
                        tokens.push(token);
                    }
                    continue;
                }

                // code
                if (token = this.tokenizer.code(src, tokens)) {
                    src = src.substring(token.raw.length);
                    if (token.type) {
                        tokens.push(token);
                    } else {
                        lastToken = tokens[tokens.length - 1];
                        lastToken.raw += '\n' + token.raw;
                        lastToken.text += '\n' + token.text;
                    }
                    continue;
                }

                // fences
                if (token = this.tokenizer.fences(src)) {
                    src = src.substring(token.raw.length);
                    tokens.push(token);
                    continue;
                }

                // heading
                if (token = this.tokenizer.heading(src)) {
                    src = src.substring(token.raw.length);
                    tokens.push(token);
                    continue;
                }

                // table no leading pipe (gfm)
                if (token = this.tokenizer.nptable(src)) {
                    src = src.substring(token.raw.length);
                    tokens.push(token);
                    continue;
                }

                // hr
                if (token = this.tokenizer.hr(src)) {
                    src = src.substring(token.raw.length);
                    tokens.push(token);
                    continue;
                }

                // blockquote
                if (token = this.tokenizer.blockquote(src)) {
                    src = src.substring(token.raw.length);
                    token.tokens = this.blockTokens(token.text, [], top);
                    tokens.push(token);
                    continue;
                }

                // list
                if (token = this.tokenizer.list(src)) {
                    src = src.substring(token.raw.length);
                    l = token.items.length;
                    for (i = 0; i < l; i++) {
                        token.items[i].tokens = this.blockTokens(token.items[i].text, [], false);
                    }
                    tokens.push(token);
                    continue;
                }

                // html
                if (token = this.tokenizer.html(src)) {
                    src = src.substring(token.raw.length);
                    tokens.push(token);
                    continue;
                }

                // def
                if (top && (token = this.tokenizer.def(src))) {
                    src = src.substring(token.raw.length);
                    if (!this.tokens.links[token.tag]) {
                        this.tokens.links[token.tag] = {
                            href: token.href,
                            title: token.title
                        };
                    }
                    continue;
                }

                // table (gfm)
                if (token = this.tokenizer.table(src)) {
                    src = src.substring(token.raw.length);
                    tokens.push(token);
                    continue;
                }

                // lheading
                if (token = this.tokenizer.lheading(src)) {
                    src = src.substring(token.raw.length);
                    tokens.push(token);
                    continue;
                }

                // top-level paragraph
                if (top && (token = this.tokenizer.paragraph(src))) {
                    src = src.substring(token.raw.length);
                    tokens.push(token);
                    continue;
                }

                // text
                if (token = this.tokenizer.text(src, tokens)) {
                    src = src.substring(token.raw.length);
                    if (token.type) {
                        tokens.push(token);
                    } else {
                        lastToken = tokens[tokens.length - 1];
                        lastToken.raw += '\n' + token.raw;
                        lastToken.text += '\n' + token.text;
                    }
                    continue;
                }

                if (src) {
                    var errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);
                    if (this.options.silent) {
                        console.error(errMsg);
                        break;
                    } else {
                        throw new Error(errMsg);
                    }
                }
            }

            return tokens;
        };

        Lexer.prototype.inline = function inline (tokens) {
            var i,
                j,
                k,
                l2,
                row,
                token;

            var l = tokens.length;
            for (i = 0; i < l; i++) {
                token = tokens[i];
                switch (token.type) {
                    case 'paragraph':
                    case 'text':
                    case 'heading': {
                        token.tokens = [];
                        this.inlineTokens(token.text, token.tokens);
                        break;
                    }
                    case 'table': {
                        token.tokens = {
                            header: [],
                            cells: []
                        };

                        // header
                        l2 = token.header.length;
                        for (j = 0; j < l2; j++) {
                            token.tokens.header[j] = [];
                            this.inlineTokens(token.header[j], token.tokens.header[j]);
                        }

                        // cells
                        l2 = token.cells.length;
                        for (j = 0; j < l2; j++) {
                            row = token.cells[j];
                            token.tokens.cells[j] = [];
                            for (k = 0; k < row.length; k++) {
                                token.tokens.cells[j][k] = [];
                                this.inlineTokens(row[k], token.tokens.cells[j][k]);
                            }
                        }

                        break;
                    }
                    case 'blockquote': {
                        this.inline(token.tokens);
                        break;
                    }
                    case 'list': {
                        l2 = token.items.length;
                        for (j = 0; j < l2; j++) {
                            this.inline(token.items[j].tokens);
                        }
                        break;
                    }
                }
            }

            return tokens;
        };

        /**
         * Lexing/Compiling
         */
        Lexer.prototype.inlineTokens = function inlineTokens (src, tokens, inLink, inRawBlock) {
            if ( tokens === void 0 ) tokens = [];
            if ( inLink === void 0 ) inLink = false;
            if ( inRawBlock === void 0 ) inRawBlock = false;

            var token;

            // String with links masked to avoid interference with em and strong
            var maskedSrc = src;
            var match;
            var keepPrevChar, prevChar;

            // Mask out reflinks
            if (this.tokens.links) {
                var links = Object.keys(this.tokens.links);
                if (links.length > 0) {
                    while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {
                        if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) {
                            maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString$1('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);
                        }
                    }
                }
            }
            // Mask out other blocks
            while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {
                maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString$1('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);
            }

            while (src) {
                if (!keepPrevChar) {
                    prevChar = '';
                }
                keepPrevChar = false;
                // escape
                if (token = this.tokenizer.escape(src)) {
                    src = src.substring(token.raw.length);
                    tokens.push(token);
                    continue;
                }

                // tag
                if (token = this.tokenizer.tag(src, inLink, inRawBlock)) {
                    src = src.substring(token.raw.length);
                    inLink = token.inLink;
                    inRawBlock = token.inRawBlock;
                    tokens.push(token);
                    continue;
                }

                // link
                if (token = this.tokenizer.link(src)) {
                    src = src.substring(token.raw.length);
                    if (token.type === 'link') {
                        token.tokens = this.inlineTokens(token.text, [], true, inRawBlock);
                    }
                    tokens.push(token);
                    continue;
                }

                // reflink, nolink
                if (token = this.tokenizer.reflink(src, this.tokens.links)) {
                    src = src.substring(token.raw.length);
                    if (token.type === 'link') {
                        token.tokens = this.inlineTokens(token.text, [], true, inRawBlock);
                    }
                    tokens.push(token);
                    continue;
                }

                // strong
                if (token = this.tokenizer.strong(src, maskedSrc, prevChar)) {
                    src = src.substring(token.raw.length);
                    token.tokens = this.inlineTokens(token.text, [], inLink, inRawBlock);
                    tokens.push(token);
                    continue;
                }

                // em
                if (token = this.tokenizer.em(src, maskedSrc, prevChar)) {
                    src = src.substring(token.raw.length);
                    token.tokens = this.inlineTokens(token.text, [], inLink, inRawBlock);
                    tokens.push(token);
                    continue;
                }

                // code
                if (token = this.tokenizer.codespan(src)) {
                    src = src.substring(token.raw.length);
                    tokens.push(token);
                    continue;
                }

                // br
                if (token = this.tokenizer.br(src)) {
                    src = src.substring(token.raw.length);
                    tokens.push(token);
                    continue;
                }

                // del (gfm)
                if (token = this.tokenizer.del(src)) {
                    src = src.substring(token.raw.length);
                    token.tokens = this.inlineTokens(token.text, [], inLink, inRawBlock);
                    tokens.push(token);
                    continue;
                }

                // autolink
                if (token = this.tokenizer.autolink(src, mangle)) {
                    src = src.substring(token.raw.length);
                    tokens.push(token);
                    continue;
                }

                // url (gfm)
                if (!inLink && (token = this.tokenizer.url(src, mangle))) {
                    src = src.substring(token.raw.length);
                    tokens.push(token);
                    continue;
                }

                // text
                if (token = this.tokenizer.inlineText(src, inRawBlock, smartypants)) {
                    src = src.substring(token.raw.length);
                    prevChar = token.raw.slice(-1);
                    keepPrevChar = true;
                    tokens.push(token);
                    continue;
                }

                if (src) {
                    var errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);
                    if (this.options.silent) {
                        console.error(errMsg);
                        break;
                    } else {
                        throw new Error(errMsg);
                    }
                }
            }

            return tokens;
        };

        Object.defineProperties( Lexer, staticAccessors );

        return Lexer;
    }());

    var defaults$3 = defaults.defaults;

    var cleanUrl$1 = helpers.cleanUrl;
    var escape$2 = helpers.escape;

    /**
     * Renderer
     */
    var Renderer = /*@__PURE__*/(function () {
        function Renderer(options) {
            this.options = options || defaults$3;
        }

        Renderer.prototype.code = function code (code$1, infostring, escaped) {
            var lang = (infostring || '').match(/\S*/)[0];
            if (this.options.highlight) {
                var out = this.options.highlight(code$1, lang);
                if (out != null && out !== code$1) {
                    escaped = true;
                    code$1 = out;
                }
            }

            code$1 = code$1.replace(/\n$/, '') + '\n';

            if (!lang) {
                return '<pre><code>'
                    + (escaped ? code$1 : escape$2(code$1, true))
                    + '</code></pre>\n';
            }

            return '<pre><code class="'
                + this.options.langPrefix
                + escape$2(lang, true)
                + '">'
                + (escaped ? code$1 : escape$2(code$1, true))
                + '</code></pre>\n';
        };

        Renderer.prototype.blockquote = function blockquote (quote) {
            return '<blockquote>\n' + quote + '</blockquote>\n';
        };

        Renderer.prototype.html = function html (html$1) {
            return html$1;
        };

        Renderer.prototype.heading = function heading (text, level, raw, slugger) {
            if (this.options.headerIds) {
                return '<h'
                    + level
                    + ' id="'
                    + this.options.headerPrefix
                    + slugger.slug(raw)
                    + '">'
                    + text
                    + '</h'
                    + level
                    + '>\n';
            }
            // ignore IDs
            return '<h' + level + '>' + text + '</h' + level + '>\n';
        };

        Renderer.prototype.hr = function hr () {
            return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
        };

        Renderer.prototype.list = function list (body, ordered, start) {
            var type = ordered ? 'ol' : 'ul',
                startatt = (ordered && start !== 1) ? (' start="' + start + '"') : '';
            return '<' + type + startatt + '>\n' + body + '</' + type + '>\n';
        };

        Renderer.prototype.listitem = function listitem (text) {
            return '<li>' + text + '</li>\n';
        };

        Renderer.prototype.checkbox = function checkbox (checked) {
            return '<input '
                + (checked ? 'checked="" ' : '')
                + 'disabled="" type="checkbox"'
                + (this.options.xhtml ? ' /' : '')
                + '> ';
        };

        Renderer.prototype.paragraph = function paragraph (text) {
            return '<p>' + text + '</p>\n';
        };

        Renderer.prototype.table = function table (header, body) {
            if (body) { body = '<tbody>' + body + '</tbody>'; }

            return '<table>\n'
                + '<thead>\n'
                + header
                + '</thead>\n'
                + body
                + '</table>\n';
        };

        Renderer.prototype.tablerow = function tablerow (content) {
            return '<tr>\n' + content + '</tr>\n';
        };

        Renderer.prototype.tablecell = function tablecell (content, flags) {
            var type = flags.header ? 'th' : 'td';
            var tag = flags.align
                ? '<' + type + ' align="' + flags.align + '">'
                : '<' + type + '>';
            return tag + content + '</' + type + '>\n';
        };

        // span level renderer
        Renderer.prototype.strong = function strong (text) {
            return '<strong>' + text + '</strong>';
        };

        Renderer.prototype.em = function em (text) {
            return '<em>' + text + '</em>';
        };

        Renderer.prototype.codespan = function codespan (text) {
            return '<code>' + text + '</code>';
        };

        Renderer.prototype.br = function br () {
            return this.options.xhtml ? '<br/>' : '<br>';
        };

        Renderer.prototype.del = function del (text) {
            return '<del>' + text + '</del>';
        };

        Renderer.prototype.link = function link (href, title, text) {
            href = cleanUrl$1(this.options.sanitize, this.options.baseUrl, href);
            if (href === null) {
                return text;
            }
            var out = '<a href="' + escape$2(href) + '"';
            if (title) {
                out += ' title="' + title + '"';
            }
            out += '>' + text + '</a>';
            return out;
        };

        Renderer.prototype.image = function image (href, title, text) {
            href = cleanUrl$1(this.options.sanitize, this.options.baseUrl, href);
            if (href === null) {
                return text;
            }

            var out = '<img src="' + href + '" alt="' + text + '"';
            if (title) {
                out += ' title="' + title + '"';
            }
            out += this.options.xhtml ? '/>' : '>';
            return out;
        };

        Renderer.prototype.text = function text (text$1) {
            return text$1;
        };

        return Renderer;
    }());

    /**
     * TextRenderer
     * returns only the textual part of the token
     */
    var TextRenderer = /*@__PURE__*/(function () {
        function TextRenderer () {}

        TextRenderer.prototype.strong = function strong (text) {
            return text;
        };

        TextRenderer.prototype.em = function em (text) {
            return text;
        };

        TextRenderer.prototype.codespan = function codespan (text) {
            return text;
        };

        TextRenderer.prototype.del = function del (text) {
            return text;
        };

        TextRenderer.prototype.html = function html (text) {
            return text;
        };

        TextRenderer.prototype.text = function text (text$1) {
            return text$1;
        };

        TextRenderer.prototype.link = function link (href, title, text) {
            return '' + text;
        };

        TextRenderer.prototype.image = function image (href, title, text) {
            return '' + text;
        };

        TextRenderer.prototype.br = function br () {
            return '';
        };

        return TextRenderer;
    }());

    /**
     * Slugger generates header id
     */
    var Slugger = /*@__PURE__*/(function () {
        function Slugger() {
            this.seen = {};
        }

        Slugger.prototype.serialize = function serialize (value) {
            return value
                .toLowerCase()
                .trim()
                // remove html tags
                .replace(/<[!\/a-z].*?>/ig, '')
                // remove unwanted chars
                .replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, '')
                .replace(/\s/g, '-');
        };

        /**
         * Finds the next safe (unique) slug to use
         */
        Slugger.prototype.getNextSafeSlug = function getNextSafeSlug (originalSlug, isDryRun) {
            var slug = originalSlug;
            var occurenceAccumulator = 0;
            if (this.seen.hasOwnProperty(slug)) {
                occurenceAccumulator = this.seen[originalSlug];
                do {
                    occurenceAccumulator++;
                    slug = originalSlug + '-' + occurenceAccumulator;
                } while (this.seen.hasOwnProperty(slug));
            }
            if (!isDryRun) {
                this.seen[originalSlug] = occurenceAccumulator;
                this.seen[slug] = 0;
            }
            return slug;
        };

        /**
         * Convert string to unique id
         * @param {object} options
         * @param {boolean} options.dryrun Generates the next unique slug without updating the internal accumulator.
         */
        Slugger.prototype.slug = function slug (value, options) {
            if ( options === void 0 ) options = {};

            var slug = this.serialize(value);
            return this.getNextSafeSlug(slug, options.dryrun);
        };

        return Slugger;
    }());

    var defaults$4 = defaults.defaults;

    var unescape$1 = helpers.unescape;

    /**
     * Parsing & Compiling
     */
    var Parser = /*@__PURE__*/(function () {
        function Parser(options) {
            this.options = options || defaults$4;
            this.options.renderer = this.options.renderer || new Renderer();
            this.renderer = this.options.renderer;
            this.renderer.options = this.options;
            this.textRenderer = new TextRenderer();
            this.slugger = new Slugger();
        }

        /**
         * Static Parse Method
         */
        Parser.parse = function parse (tokens, options) {
            var parser = new Parser(options);
            return parser.parse(tokens);
        };

        /**
         * Static Parse Inline Method
         */
        Parser.parseInline = function parseInline (tokens, options) {
            var parser = new Parser(options);
            return parser.parseInline(tokens);
        };

        /**
         * Parse Loop
         */
        Parser.prototype.parse = function parse (tokens, top) {
            if ( top === void 0 ) top = true;

            var out = '',
                i,
                j,
                k,
                l2,
                l3,
                row,
                cell,
                header,
                body,
                token,
                ordered,
                start,
                loose,
                itemBody,
                item,
                checked,
                task,
                checkbox;

            var l = tokens.length;
            for (i = 0; i < l; i++) {
                token = tokens[i];
                switch (token.type) {
                    case 'space': {
                        continue;
                    }
                    case 'hr': {
                        out += this.renderer.hr();
                        continue;
                    }
                    case 'heading': {
                        out += this.renderer.heading(
                            this.parseInline(token.tokens),
                            token.depth,
                            unescape$1(this.parseInline(token.tokens, this.textRenderer)),
                            this.slugger);
                        continue;
                    }
                    case 'code': {
                        out += this.renderer.code(token.text,
                            token.lang,
                            token.escaped);
                        continue;
                    }
                    case 'table': {
                        header = '';

                        // header
                        cell = '';
                        l2 = token.header.length;
                        for (j = 0; j < l2; j++) {
                            cell += this.renderer.tablecell(
                                this.parseInline(token.tokens.header[j]),
                                { header: true, align: token.align[j] }
                            );
                        }
                        header += this.renderer.tablerow(cell);

                        body = '';
                        l2 = token.cells.length;
                        for (j = 0; j < l2; j++) {
                            row = token.tokens.cells[j];

                            cell = '';
                            l3 = row.length;
                            for (k = 0; k < l3; k++) {
                                cell += this.renderer.tablecell(
                                    this.parseInline(row[k]),
                                    { header: false, align: token.align[k] }
                                );
                            }

                            body += this.renderer.tablerow(cell);
                        }
                        out += this.renderer.table(header, body);
                        continue;
                    }
                    case 'blockquote': {
                        body = this.parse(token.tokens);
                        out += this.renderer.blockquote(body);
                        continue;
                    }
                    case 'list': {
                        ordered = token.ordered;
                        start = token.start;
                        loose = token.loose;
                        l2 = token.items.length;

                        body = '';
                        for (j = 0; j < l2; j++) {
                            item = token.items[j];
                            checked = item.checked;
                            task = item.task;

                            itemBody = '';
                            if (item.task) {
                                checkbox = this.renderer.checkbox(checked);
                                if (loose) {
                                    if (item.tokens.length > 0 && item.tokens[0].type === 'text') {
                                        item.tokens[0].text = checkbox + ' ' + item.tokens[0].text;
                                        if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') {
                                            item.tokens[0].tokens[0].text = checkbox + ' ' + item.tokens[0].tokens[0].text;
                                        }
                                    } else {
                                        item.tokens.unshift({
                                            type: 'text',
                                            text: checkbox
                                        });
                                    }
                                } else {
                                    itemBody += checkbox;
                                }
                            }

                            itemBody += this.parse(item.tokens, loose);
                            body += this.renderer.listitem(itemBody, task, checked);
                        }

                        out += this.renderer.list(body, ordered, start);
                        continue;
                    }
                    case 'html': {
                        // TODO parse inline content if parameter markdown=1
                        out += this.renderer.html(token.text);
                        continue;
                    }
                    case 'paragraph': {
                        out += this.renderer.paragraph(this.parseInline(token.tokens));
                        continue;
                    }
                    case 'text': {
                        body = token.tokens ? this.parseInline(token.tokens) : token.text;
                        while (i + 1 < l && tokens[i + 1].type === 'text') {
                            token = tokens[++i];
                            body += '\n' + (token.tokens ? this.parseInline(token.tokens) : token.text);
                        }
                        out += top ? this.renderer.paragraph(body) : body;
                        continue;
                    }
                    default: {
                        var errMsg = 'Token with "' + token.type + '" type was not found.';
                        if (this.options.silent) {
                            console.error(errMsg);
                            return;
                        } else {
                            throw new Error(errMsg);
                        }
                    }
                }
            }

            return out;
        };

        /**
         * Parse Inline Tokens
         */
        Parser.prototype.parseInline = function parseInline (tokens, renderer) {
            renderer = renderer || this.renderer;
            var out = '',
                i,
                token;

            var l = tokens.length;
            for (i = 0; i < l; i++) {
                token = tokens[i];
                switch (token.type) {
                    case 'escape': {
                        out += renderer.text(token.text);
                        break;
                    }
                    case 'html': {
                        out += renderer.html(token.text);
                        break;
                    }
                    case 'link': {
                        out += renderer.link(token.href, token.title, this.parseInline(token.tokens, renderer));
                        break;
                    }
                    case 'image': {
                        out += renderer.image(token.href, token.title, token.text);
                        break;
                    }
                    case 'strong': {
                        out += renderer.strong(this.parseInline(token.tokens, renderer));
                        break;
                    }
                    case 'em': {
                        out += renderer.em(this.parseInline(token.tokens, renderer));
                        break;
                    }
                    case 'codespan': {
                        out += renderer.codespan(token.text);
                        break;
                    }
                    case 'br': {
                        out += renderer.br();
                        break;
                    }
                    case 'del': {
                        out += renderer.del(this.parseInline(token.tokens, renderer));
                        break;
                    }
                    case 'text': {
                        out += renderer.text(token.text);
                        break;
                    }
                    default: {
                        var errMsg = 'Token with "' + token.type + '" type was not found.';
                        if (this.options.silent) {
                            console.error(errMsg);
                            return;
                        } else {
                            throw new Error(errMsg);
                        }
                    }
                }
            }
            return out;
        };

        return Parser;
    }());

    var merge$3 = helpers.merge;
    var checkSanitizeDeprecation$1 = helpers.checkSanitizeDeprecation;
    var escape$3 = helpers.escape;

    var getDefaults = defaults.getDefaults;
    var changeDefaults = defaults.changeDefaults;
    var defaults$5 = defaults.defaults;

    /**
     * Marked
     */
    function marked(src, opt, callback) {
        // throw error in case of non string input
        if (typeof src === 'undefined' || src === null) {
            throw new Error('marked(): input parameter is undefined or null');
        }
        if (typeof src !== 'string') {
            throw new Error('marked(): input parameter is of type '
                + Object.prototype.toString.call(src) + ', string expected');
        }

        if (typeof opt === 'function') {
            callback = opt;
            opt = null;
        }

        opt = merge$3({}, marked.defaults, opt || {});
        checkSanitizeDeprecation$1(opt);

        if (callback) {
            var highlight = opt.highlight;
            var tokens;

            try {
                tokens = Lexer.lex(src, opt);
            } catch (e) {
                return callback(e);
            }

            var done = function(err) {
                var out;

                if (!err) {
                    try {
                        out = Parser.parse(tokens, opt);
                    } catch (e) {
                        err = e;
                    }
                }

                opt.highlight = highlight;

                return err
                    ? callback(err)
                    : callback(null, out);
            };

            if (!highlight || highlight.length < 3) {
                return done();
            }

            delete opt.highlight;

            if (!tokens.length) { return done(); }

            var pending = 0;
            marked.walkTokens(tokens, function(token) {
                if (token.type === 'code') {
                    pending++;
                    setTimeout(function () {
                        highlight(token.text, token.lang, function(err, code) {
                            if (err) {
                                return done(err);
                            }
                            if (code != null && code !== token.text) {
                                token.text = code;
                                token.escaped = true;
                            }

                            pending--;
                            if (pending === 0) {
                                done();
                            }
                        });
                    }, 0);
                }
            });

            if (pending === 0) {
                done();
            }

            return;
        }

        try {
            var tokens$1 = Lexer.lex(src, opt);
            if (opt.walkTokens) {
                marked.walkTokens(tokens$1, opt.walkTokens);
            }
            return Parser.parse(tokens$1, opt);
        } catch (e) {
            e.message += '\nPlease report this to https://github.com/markedjs/marked.';
            if (opt.silent) {
                return '<p>An error occurred:</p><pre>'
                    + escape$3(e.message + '', true)
                    + '</pre>';
            }
            throw e;
        }
    }

    /**
     * Options
     */

    marked.options =
        marked.setOptions = function(opt) {
            merge$3(marked.defaults, opt);
            changeDefaults(marked.defaults);
            return marked;
        };

    marked.getDefaults = getDefaults;

    marked.defaults = defaults$5;

    /**
     * Use Extension
     */

    marked.use = function(extension) {
        var opts = merge$3({}, extension);
        if (extension.renderer) {
            var renderer = marked.defaults.renderer || new Renderer();
            var loop = function ( prop ) {
                var prevRenderer = renderer[prop];
                renderer[prop] = function () {
                    var args = [], len = arguments.length;
                    while ( len-- ) args[ len ] = arguments[ len ];

                    var ret = extension.renderer[prop].apply(renderer, args);
                    if (ret === false) {
                        ret = prevRenderer.apply(renderer, args);
                    }
                    return ret;
                };
            };

            for (var prop in extension.renderer) loop( prop );
            opts.renderer = renderer;
        }
        if (extension.tokenizer) {
            var tokenizer = marked.defaults.tokenizer || new Tokenizer();
            var loop$1 = function ( prop ) {
                var prevTokenizer = tokenizer[prop$1];
                tokenizer[prop$1] = function () {
                    var args = [], len = arguments.length;
                    while ( len-- ) args[ len ] = arguments[ len ];

                    var ret = extension.tokenizer[prop$1].apply(tokenizer, args);
                    if (ret === false) {
                        ret = prevTokenizer.apply(tokenizer, args);
                    }
                    return ret;
                };
            };

            for (var prop$1 in extension.tokenizer) loop$1( prop );
            opts.tokenizer = tokenizer;
        }
        if (extension.walkTokens) {
            var walkTokens = marked.defaults.walkTokens;
            opts.walkTokens = function (token) {
                extension.walkTokens(token);
                if (walkTokens) {
                    walkTokens(token);
                }
            };
        }
        marked.setOptions(opts);
    };

    /**
     * Run callback for every token
     */

    marked.walkTokens = function(tokens, callback) {
        for (var i$3 = 0, list$3 = tokens; i$3 < list$3.length; i$3 += 1) {
            var token = list$3[i$3];

            callback(token);
            switch (token.type) {
                case 'table': {
                    for (var i = 0, list = token.tokens.header; i < list.length; i += 1) {
                        var cell = list[i];

                        marked.walkTokens(cell, callback);
                    }
                    for (var i$2 = 0, list$2 = token.tokens.cells; i$2 < list$2.length; i$2 += 1) {
                        var row = list$2[i$2];

                        for (var i$1 = 0, list$1 = row; i$1 < list$1.length; i$1 += 1) {
                            var cell$1 = list$1[i$1];

                            marked.walkTokens(cell$1, callback);
                        }
                    }
                    break;
                }
                case 'list': {
                    marked.walkTokens(token.items, callback);
                    break;
                }
                default: {
                    if (token.tokens) {
                        marked.walkTokens(token.tokens, callback);
                    }
                }
            }
        }
    };

    /**
     * Parse Inline
     */
    marked.parseInline = function(src, opt) {
        // throw error in case of non string input
        if (typeof src === 'undefined' || src === null) {
            throw new Error('marked.parseInline(): input parameter is undefined or null');
        }
        if (typeof src !== 'string') {
            throw new Error('marked.parseInline(): input parameter is of type '
                + Object.prototype.toString.call(src) + ', string expected');
        }

        opt = merge$3({}, marked.defaults, opt || {});
        checkSanitizeDeprecation$1(opt);

        try {
            var tokens = Lexer.lexInline(src, opt);
            if (opt.walkTokens) {
                marked.walkTokens(tokens, opt.walkTokens);
            }
            return Parser.parseInline(tokens, opt);
        } catch (e) {
            e.message += '\nPlease report this to https://github.com/markedjs/marked.';
            if (opt.silent) {
                return '<p>An error occurred:</p><pre>'
                    + escape$3(e.message + '', true)
                    + '</pre>';
            }
            throw e;
        }
    };

    /**
     * Expose
     */

    marked.Parser = Parser;
    marked.parser = Parser.parse;

    marked.Renderer = Renderer;
    marked.TextRenderer = TextRenderer;

    marked.Lexer = Lexer;
    marked.lexer = Lexer.lex;

    marked.Tokenizer = Tokenizer;

    marked.Slugger = Slugger;

    marked.parse = marked;

    var marked_1 = marked;

    /**
     * Render github corner
     * @param  {Object} data URL for the View Source on Github link
     * @param {String} cornerExternalLinkTarget value of the target attribute of the link
     * @return {String} SVG element as string
     */
    function corner(data, cornerExternalLinkTarget) {
        if (!data) {
            return '';
        }

        if (!/\/\//.test(data)) {
            data = 'https://github.com/' + data;
        }

        data = data.replace(/^git\+/, '');
        // Double check
        cornerExternalLinkTarget = cornerExternalLinkTarget || '_blank';

        return (
            "<a href=\"" + data + "\" target=\"" + cornerExternalLinkTarget + "\" class=\"github-corner\" aria-label=\"View source on Github\">" +
            '<svg viewBox="0 0 250 250" aria-hidden="true">' +
            '<path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path>' +
            '<path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path>' +
            '<path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path>' +
            '</svg>' +
            '</a>'
        );
    }

    /**
     * Renders main content
     * @param {Object} config Configuration object
     * @returns {String} HTML of the main content
     */
    function main(config) {
        var name = config.name ? config.name : '';

        var aside =
            '<button class="sidebar-toggle" aria-label="Menu">' +
            '<div class="sidebar-toggle-button">' +
            '<span></span><span></span><span></span>' +
            '</div>' +
            '</button>' +
            '<aside class="sidebar">' +
            (config.name
                ? ("<h1 class=\"app-name\"><a class=\"app-name-link\" data-nosearch>" + (config.logo ? ("<img alt=\"" + name + "\" src=" + (config.logo) + ">") : name) + "</a></h1>")
                : '') +
            '<div class="sidebar-nav"><!--sidebar--></div>' +
            '</aside>';
        return (
            "<main>" + aside +
            '<section class="content">' +
            '<article class="markdown-section" id="main"><!--main--></article>' +
            '</section>' +
            '</main>'
        );
    }

    /**
     * Cover Page
     * @returns {String} Cover page
     */
    function cover() {
        var SL = ', 100%, 85%';
        var bgc =
            'linear-gradient(to left bottom, ' +
            "hsl(" + (Math.floor(Math.random() * 255) + SL) + ") 0%," +
            "hsl(" + (Math.floor(Math.random() * 255) + SL) + ") 100%)";

        return (
            "<section class=\"cover show\" style=\"background: " + bgc + "\">" +
            '<div class="mask"></div>' +
            '<div class="cover-main"><!--cover--></div>' +
            '</section>'
        );
    }

    /**
     * Render tree
     * @param  {Array} toc Array of TOC section links
     * @param  {String} tpl TPL list
     * @return {String} Rendered tree
     */
    function tree(toc, tpl) {
        if ( tpl === void 0 ) tpl = '<ul class="app-sub-sidebar">{inner}</ul>';

        if (!toc || !toc.length) {
            return '';
        }

        var innerHTML = '';
        toc.forEach(function (node) {
            var title = node.title.replace(/(<([^>]+)>)/g, '');
            innerHTML += "<li><a class=\"section-link\" href=\"" + (node.slug) + "\" title=\"" + title + "\">" + (node.title) + "</a></li>";
            if (node.children) {
                innerHTML += tree(node.children, tpl);
            }
        });
        return tpl.replace('{inner}', innerHTML);
    }

    function helper(className, content) {
        return ("<p class=\"" + className + "\">" + (content.slice(5).trim()) + "</p>");
    }

    function theme(color) {
        return ("<style>:root{--theme-color: " + color + ";}</style>");
    }

    /**
     * Gen toc tree
     * @link https://github.com/killercup/grock/blob/5280ae63e16c5739e9233d9009bc235ed7d79a50/styles/solarized/assets/js/behavior.coffee#L54-L81
     * @param  {Array} toc List of TOC elements
     * @param  {Number} maxLevel Deep level
     * @return {Array} Headlines
     */
    function genTree(toc, maxLevel) {
        var headlines = [];
        var last = {};

        toc.forEach(function (headline) {
            var level = headline.level || 1;
            var len = level - 1;

            if (level > maxLevel) {
                return;
            }

            if (last[len]) {
                last[len].children = (last[len].children || []).concat(headline);
            } else {
                headlines.push(headline);
            }

            last[level] = headline;
        });

        return headlines;
    }

    var cache$1 = {};
    var re = /[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g;

    function lower(string) {
        return string.toLowerCase();
    }

    function slugify(str) {
        if (typeof str !== 'string') {
            return '';
        }

        var slug = str
            .trim()
            .replace(/[A-Z]+/g, lower)
            .replace(/<[^>]+>/g, '')
            .replace(re, '')
            .replace(/\s/g, '-')
            .replace(/-+/g, '-')
            .replace(/^(\d)/, '_$1');
        var count = cache$1[slug];

        count = hasOwn.call(cache$1, slug) ? count + 1 : 0;
        cache$1[slug] = count;

        if (count) {
            slug = slug + '-' + count;
        }

        return slug;
    }

    slugify.clear = function () {
        cache$1 = {};
    };

    /* eslint-disable */

    // =============================================================================
    // DO NOT EDIT: This file is auto-generated by an /build/emoji.js
    // =============================================================================

    var emojiData = {
        "baseURL": "https://github.githubassets.com/images/icons/emoji/",
        "data": {
            "100": "unicode/1f4af.png?v8",
            "1234": "unicode/1f522.png?v8",
            "+1": "unicode/1f44d.png?v8",
            "-1": "unicode/1f44e.png?v8",
            "1st_place_medal": "unicode/1f947.png?v8",
            "2nd_place_medal": "unicode/1f948.png?v8",
            "3rd_place_medal": "unicode/1f949.png?v8",
            "8ball": "unicode/1f3b1.png?v8",
            "a": "unicode/1f170.png?v8",
            "ab": "unicode/1f18e.png?v8",
            "abacus": "unicode/1f9ee.png?v8",
            "abc": "unicode/1f524.png?v8",
            "abcd": "unicode/1f521.png?v8",
            "accept": "unicode/1f251.png?v8",
            "accordion": "unicode/1fa97.png?v8",
            "adhesive_bandage": "unicode/1fa79.png?v8",
            "adult": "unicode/1f9d1.png?v8",
            "aerial_tramway": "unicode/1f6a1.png?v8",
            "afghanistan": "unicode/1f1e6-1f1eb.png?v8",
            "airplane": "unicode/2708.png?v8",
            "aland_islands": "unicode/1f1e6-1f1fd.png?v8",
            "alarm_clock": "unicode/23f0.png?v8",
            "albania": "unicode/1f1e6-1f1f1.png?v8",
            "alembic": "unicode/2697.png?v8",
            "algeria": "unicode/1f1e9-1f1ff.png?v8",
            "alien": "unicode/1f47d.png?v8",
            "ambulance": "unicode/1f691.png?v8",
            "american_samoa": "unicode/1f1e6-1f1f8.png?v8",
            "amphora": "unicode/1f3fa.png?v8",
            "anatomical_heart": "unicode/1fac0.png?v8",
            "anchor": "unicode/2693.png?v8",
            "andorra": "unicode/1f1e6-1f1e9.png?v8",
            "angel": "unicode/1f47c.png?v8",
            "anger": "unicode/1f4a2.png?v8",
            "angola": "unicode/1f1e6-1f1f4.png?v8",
            "angry": "unicode/1f620.png?v8",
            "anguilla": "unicode/1f1e6-1f1ee.png?v8",
            "anguished": "unicode/1f627.png?v8",
            "ant": "unicode/1f41c.png?v8",
            "antarctica": "unicode/1f1e6-1f1f6.png?v8",
            "antigua_barbuda": "unicode/1f1e6-1f1ec.png?v8",
            "apple": "unicode/1f34e.png?v8",
            "aquarius": "unicode/2652.png?v8",
            "argentina": "unicode/1f1e6-1f1f7.png?v8",
            "aries": "unicode/2648.png?v8",
            "armenia": "unicode/1f1e6-1f1f2.png?v8",
            "arrow_backward": "unicode/25c0.png?v8",
            "arrow_double_down": "unicode/23ec.png?v8",
            "arrow_double_up": "unicode/23eb.png?v8",
            "arrow_down": "unicode/2b07.png?v8",
            "arrow_down_small": "unicode/1f53d.png?v8",
            "arrow_forward": "unicode/25b6.png?v8",
            "arrow_heading_down": "unicode/2935.png?v8",
            "arrow_heading_up": "unicode/2934.png?v8",
            "arrow_left": "unicode/2b05.png?v8",
            "arrow_lower_left": "unicode/2199.png?v8",
            "arrow_lower_right": "unicode/2198.png?v8",
            "arrow_right": "unicode/27a1.png?v8",
            "arrow_right_hook": "unicode/21aa.png?v8",
            "arrow_up": "unicode/2b06.png?v8",
            "arrow_up_down": "unicode/2195.png?v8",
            "arrow_up_small": "unicode/1f53c.png?v8",
            "arrow_upper_left": "unicode/2196.png?v8",
            "arrow_upper_right": "unicode/2197.png?v8",
            "arrows_clockwise": "unicode/1f503.png?v8",
            "arrows_counterclockwise": "unicode/1f504.png?v8",
            "art": "unicode/1f3a8.png?v8",
            "articulated_lorry": "unicode/1f69b.png?v8",
            "artificial_satellite": "unicode/1f6f0.png?v8",
            "artist": "unicode/1f9d1-1f3a8.png?v8",
            "aruba": "unicode/1f1e6-1f1fc.png?v8",
            "ascension_island": "unicode/1f1e6-1f1e8.png?v8",
            "asterisk": "unicode/002a-20e3.png?v8",
            "astonished": "unicode/1f632.png?v8",
            "astronaut": "unicode/1f9d1-1f680.png?v8",
            "athletic_shoe": "unicode/1f45f.png?v8",
            "atm": "unicode/1f3e7.png?v8",
            "atom": "atom.png?v8",
            "atom_symbol": "unicode/269b.png?v8",
            "australia": "unicode/1f1e6-1f1fa.png?v8",
            "austria": "unicode/1f1e6-1f1f9.png?v8",
            "auto_rickshaw": "unicode/1f6fa.png?v8",
            "avocado": "unicode/1f951.png?v8",
            "axe": "unicode/1fa93.png?v8",
            "azerbaijan": "unicode/1f1e6-1f1ff.png?v8",
            "b": "unicode/1f171.png?v8",
            "baby": "unicode/1f476.png?v8",
            "baby_bottle": "unicode/1f37c.png?v8",
            "baby_chick": "unicode/1f424.png?v8",
            "baby_symbol": "unicode/1f6bc.png?v8",
            "back": "unicode/1f519.png?v8",
            "bacon": "unicode/1f953.png?v8",
            "badger": "unicode/1f9a1.png?v8",
            "badminton": "unicode/1f3f8.png?v8",
            "bagel": "unicode/1f96f.png?v8",
            "baggage_claim": "unicode/1f6c4.png?v8",
            "baguette_bread": "unicode/1f956.png?v8",
            "bahamas": "unicode/1f1e7-1f1f8.png?v8",
            "bahrain": "unicode/1f1e7-1f1ed.png?v8",
            "balance_scale": "unicode/2696.png?v8",
            "bald_man": "unicode/1f468-1f9b2.png?v8",
            "bald_woman": "unicode/1f469-1f9b2.png?v8",
            "ballet_shoes": "unicode/1fa70.png?v8",
            "balloon": "unicode/1f388.png?v8",
            "ballot_box": "unicode/1f5f3.png?v8",
            "ballot_box_with_check": "unicode/2611.png?v8",
            "bamboo": "unicode/1f38d.png?v8",
            "banana": "unicode/1f34c.png?v8",
            "bangbang": "unicode/203c.png?v8",
            "bangladesh": "unicode/1f1e7-1f1e9.png?v8",
            "banjo": "unicode/1fa95.png?v8",
            "bank": "unicode/1f3e6.png?v8",
            "bar_chart": "unicode/1f4ca.png?v8",
            "barbados": "unicode/1f1e7-1f1e7.png?v8",
            "barber": "unicode/1f488.png?v8",
            "baseball": "unicode/26be.png?v8",
            "basecamp": "basecamp.png?v8",
            "basecampy": "basecampy.png?v8",
            "basket": "unicode/1f9fa.png?v8",
            "basketball": "unicode/1f3c0.png?v8",
            "basketball_man": "unicode/26f9-2642.png?v8",
            "basketball_woman": "unicode/26f9-2640.png?v8",
            "bat": "unicode/1f987.png?v8",
            "bath": "unicode/1f6c0.png?v8",
            "bathtub": "unicode/1f6c1.png?v8",
            "battery": "unicode/1f50b.png?v8",
            "beach_umbrella": "unicode/1f3d6.png?v8",
            "bear": "unicode/1f43b.png?v8",
            "bearded_person": "unicode/1f9d4.png?v8",
            "beaver": "unicode/1f9ab.png?v8",
            "bed": "unicode/1f6cf.png?v8",
            "bee": "unicode/1f41d.png?v8",
            "beer": "unicode/1f37a.png?v8",
            "beers": "unicode/1f37b.png?v8",
            "beetle": "unicode/1fab2.png?v8",
            "beginner": "unicode/1f530.png?v8",
            "belarus": "unicode/1f1e7-1f1fe.png?v8",
            "belgium": "unicode/1f1e7-1f1ea.png?v8",
            "belize": "unicode/1f1e7-1f1ff.png?v8",
            "bell": "unicode/1f514.png?v8",
            "bell_pepper": "unicode/1fad1.png?v8",
            "bellhop_bell": "unicode/1f6ce.png?v8",
            "benin": "unicode/1f1e7-1f1ef.png?v8",
            "bento": "unicode/1f371.png?v8",
            "bermuda": "unicode/1f1e7-1f1f2.png?v8",
            "beverage_box": "unicode/1f9c3.png?v8",
            "bhutan": "unicode/1f1e7-1f1f9.png?v8",
            "bicyclist": "unicode/1f6b4.png?v8",
            "bike": "unicode/1f6b2.png?v8",
            "biking_man": "unicode/1f6b4-2642.png?v8",
            "biking_woman": "unicode/1f6b4-2640.png?v8",
            "bikini": "unicode/1f459.png?v8",
            "billed_cap": "unicode/1f9e2.png?v8",
            "biohazard": "unicode/2623.png?v8",
            "bird": "unicode/1f426.png?v8",
            "birthday": "unicode/1f382.png?v8",
            "bison": "unicode/1f9ac.png?v8",
            "black_cat": "unicode/1f408-2b1b.png?v8",
            "black_circle": "unicode/26ab.png?v8",
            "black_flag": "unicode/1f3f4.png?v8",
            "black_heart": "unicode/1f5a4.png?v8",
            "black_joker": "unicode/1f0cf.png?v8",
            "black_large_square": "unicode/2b1b.png?v8",
            "black_medium_small_square": "unicode/25fe.png?v8",
            "black_medium_square": "unicode/25fc.png?v8",
            "black_nib": "unicode/2712.png?v8",
            "black_small_square": "unicode/25aa.png?v8",
            "black_square_button": "unicode/1f532.png?v8",
            "blond_haired_man": "unicode/1f471-2642.png?v8",
            "blond_haired_person": "unicode/1f471.png?v8",
            "blond_haired_woman": "unicode/1f471-2640.png?v8",
            "blonde_woman": "unicode/1f471-2640.png?v8",
            "blossom": "unicode/1f33c.png?v8",
            "blowfish": "unicode/1f421.png?v8",
            "blue_book": "unicode/1f4d8.png?v8",
            "blue_car": "unicode/1f699.png?v8",
            "blue_heart": "unicode/1f499.png?v8",
            "blue_square": "unicode/1f7e6.png?v8",
            "blueberries": "unicode/1fad0.png?v8",
            "blush": "unicode/1f60a.png?v8",
            "boar": "unicode/1f417.png?v8",
            "boat": "unicode/26f5.png?v8",
            "bolivia": "unicode/1f1e7-1f1f4.png?v8",
            "bomb": "unicode/1f4a3.png?v8",
            "bone": "unicode/1f9b4.png?v8",
            "book": "unicode/1f4d6.png?v8",
            "bookmark": "unicode/1f516.png?v8",
            "bookmark_tabs": "unicode/1f4d1.png?v8",
            "books": "unicode/1f4da.png?v8",
            "boom": "unicode/1f4a5.png?v8",
            "boomerang": "unicode/1fa83.png?v8",
            "boot": "unicode/1f462.png?v8",
            "bosnia_herzegovina": "unicode/1f1e7-1f1e6.png?v8",
            "botswana": "unicode/1f1e7-1f1fc.png?v8",
            "bouncing_ball_man": "unicode/26f9-2642.png?v8",
            "bouncing_ball_person": "unicode/26f9.png?v8",
            "bouncing_ball_woman": "unicode/26f9-2640.png?v8",
            "bouquet": "unicode/1f490.png?v8",
            "bouvet_island": "unicode/1f1e7-1f1fb.png?v8",
            "bow": "unicode/1f647.png?v8",
            "bow_and_arrow": "unicode/1f3f9.png?v8",
            "bowing_man": "unicode/1f647-2642.png?v8",
            "bowing_woman": "unicode/1f647-2640.png?v8",
            "bowl_with_spoon": "unicode/1f963.png?v8",
            "bowling": "unicode/1f3b3.png?v8",
            "bowtie": "bowtie.png?v8",
            "boxing_glove": "unicode/1f94a.png?v8",
            "boy": "unicode/1f466.png?v8",
            "brain": "unicode/1f9e0.png?v8",
            "brazil": "unicode/1f1e7-1f1f7.png?v8",
            "bread": "unicode/1f35e.png?v8",
            "breast_feeding": "unicode/1f931.png?v8",
            "bricks": "unicode/1f9f1.png?v8",
            "bride_with_veil": "unicode/1f470-2640.png?v8",
            "bridge_at_night": "unicode/1f309.png?v8",
            "briefcase": "unicode/1f4bc.png?v8",
            "british_indian_ocean_territory": "unicode/1f1ee-1f1f4.png?v8",
            "british_virgin_islands": "unicode/1f1fb-1f1ec.png?v8",
            "broccoli": "unicode/1f966.png?v8",
            "broken_heart": "unicode/1f494.png?v8",
            "broom": "unicode/1f9f9.png?v8",
            "brown_circle": "unicode/1f7e4.png?v8",
            "brown_heart": "unicode/1f90e.png?v8",
            "brown_square": "unicode/1f7eb.png?v8",
            "brunei": "unicode/1f1e7-1f1f3.png?v8",
            "bubble_tea": "unicode/1f9cb.png?v8",
            "bucket": "unicode/1faa3.png?v8",
            "bug": "unicode/1f41b.png?v8",
            "building_construction": "unicode/1f3d7.png?v8",
            "bulb": "unicode/1f4a1.png?v8",
            "bulgaria": "unicode/1f1e7-1f1ec.png?v8",
            "bullettrain_front": "unicode/1f685.png?v8",
            "bullettrain_side": "unicode/1f684.png?v8",
            "burkina_faso": "unicode/1f1e7-1f1eb.png?v8",
            "burrito": "unicode/1f32f.png?v8",
            "burundi": "unicode/1f1e7-1f1ee.png?v8",
            "bus": "unicode/1f68c.png?v8",
            "business_suit_levitating": "unicode/1f574.png?v8",
            "busstop": "unicode/1f68f.png?v8",
            "bust_in_silhouette": "unicode/1f464.png?v8",
            "busts_in_silhouette": "unicode/1f465.png?v8",
            "butter": "unicode/1f9c8.png?v8",
            "butterfly": "unicode/1f98b.png?v8",
            "cactus": "unicode/1f335.png?v8",
            "cake": "unicode/1f370.png?v8",
            "calendar": "unicode/1f4c6.png?v8",
            "call_me_hand": "unicode/1f919.png?v8",
            "calling": "unicode/1f4f2.png?v8",
            "cambodia": "unicode/1f1f0-1f1ed.png?v8",
            "camel": "unicode/1f42b.png?v8",
            "camera": "unicode/1f4f7.png?v8",
            "camera_flash": "unicode/1f4f8.png?v8",
            "cameroon": "unicode/1f1e8-1f1f2.png?v8",
            "camping": "unicode/1f3d5.png?v8",
            "canada": "unicode/1f1e8-1f1e6.png?v8",
            "canary_islands": "unicode/1f1ee-1f1e8.png?v8",
            "cancer": "unicode/264b.png?v8",
            "candle": "unicode/1f56f.png?v8",
            "candy": "unicode/1f36c.png?v8",
            "canned_food": "unicode/1f96b.png?v8",
            "canoe": "unicode/1f6f6.png?v8",
            "cape_verde": "unicode/1f1e8-1f1fb.png?v8",
            "capital_abcd": "unicode/1f520.png?v8",
            "capricorn": "unicode/2651.png?v8",
            "car": "unicode/1f697.png?v8",
            "card_file_box": "unicode/1f5c3.png?v8",
            "card_index": "unicode/1f4c7.png?v8",
            "card_index_dividers": "unicode/1f5c2.png?v8",
            "caribbean_netherlands": "unicode/1f1e7-1f1f6.png?v8",
            "carousel_horse": "unicode/1f3a0.png?v8",
            "carpentry_saw": "unicode/1fa9a.png?v8",
            "carrot": "unicode/1f955.png?v8",
            "cartwheeling": "unicode/1f938.png?v8",
            "cat": "unicode/1f431.png?v8",
            "cat2": "unicode/1f408.png?v8",
            "cayman_islands": "unicode/1f1f0-1f1fe.png?v8",
            "cd": "unicode/1f4bf.png?v8",
            "central_african_republic": "unicode/1f1e8-1f1eb.png?v8",
            "ceuta_melilla": "unicode/1f1ea-1f1e6.png?v8",
            "chad": "unicode/1f1f9-1f1e9.png?v8",
            "chains": "unicode/26d3.png?v8",
            "chair": "unicode/1fa91.png?v8",
            "champagne": "unicode/1f37e.png?v8",
            "chart": "unicode/1f4b9.png?v8",
            "chart_with_downwards_trend": "unicode/1f4c9.png?v8",
            "chart_with_upwards_trend": "unicode/1f4c8.png?v8",
            "checkered_flag": "unicode/1f3c1.png?v8",
            "cheese": "unicode/1f9c0.png?v8",
            "cherries": "unicode/1f352.png?v8",
            "cherry_blossom": "unicode/1f338.png?v8",
            "chess_pawn": "unicode/265f.png?v8",
            "chestnut": "unicode/1f330.png?v8",
            "chicken": "unicode/1f414.png?v8",
            "child": "unicode/1f9d2.png?v8",
            "children_crossing": "unicode/1f6b8.png?v8",
            "chile": "unicode/1f1e8-1f1f1.png?v8",
            "chipmunk": "unicode/1f43f.png?v8",
            "chocolate_bar": "unicode/1f36b.png?v8",
            "chopsticks": "unicode/1f962.png?v8",
            "christmas_island": "unicode/1f1e8-1f1fd.png?v8",
            "christmas_tree": "unicode/1f384.png?v8",
            "church": "unicode/26ea.png?v8",
            "cinema": "unicode/1f3a6.png?v8",
            "circus_tent": "unicode/1f3aa.png?v8",
            "city_sunrise": "unicode/1f307.png?v8",
            "city_sunset": "unicode/1f306.png?v8",
            "cityscape": "unicode/1f3d9.png?v8",
            "cl": "unicode/1f191.png?v8",
            "clamp": "unicode/1f5dc.png?v8",
            "clap": "unicode/1f44f.png?v8",
            "clapper": "unicode/1f3ac.png?v8",
            "classical_building": "unicode/1f3db.png?v8",
            "climbing": "unicode/1f9d7.png?v8",
            "climbing_man": "unicode/1f9d7-2642.png?v8",
            "climbing_woman": "unicode/1f9d7-2640.png?v8",
            "clinking_glasses": "unicode/1f942.png?v8",
            "clipboard": "unicode/1f4cb.png?v8",
            "clipperton_island": "unicode/1f1e8-1f1f5.png?v8",
            "clock1": "unicode/1f550.png?v8",
            "clock10": "unicode/1f559.png?v8",
            "clock1030": "unicode/1f565.png?v8",
            "clock11": "unicode/1f55a.png?v8",
            "clock1130": "unicode/1f566.png?v8",
            "clock12": "unicode/1f55b.png?v8",
            "clock1230": "unicode/1f567.png?v8",
            "clock130": "unicode/1f55c.png?v8",
            "clock2": "unicode/1f551.png?v8",
            "clock230": "unicode/1f55d.png?v8",
            "clock3": "unicode/1f552.png?v8",
            "clock330": "unicode/1f55e.png?v8",
            "clock4": "unicode/1f553.png?v8",
            "clock430": "unicode/1f55f.png?v8",
            "clock5": "unicode/1f554.png?v8",
            "clock530": "unicode/1f560.png?v8",
            "clock6": "unicode/1f555.png?v8",
            "clock630": "unicode/1f561.png?v8",
            "clock7": "unicode/1f556.png?v8",
            "clock730": "unicode/1f562.png?v8",
            "clock8": "unicode/1f557.png?v8",
            "clock830": "unicode/1f563.png?v8",
            "clock9": "unicode/1f558.png?v8",
            "clock930": "unicode/1f564.png?v8",
            "closed_book": "unicode/1f4d5.png?v8",
            "closed_lock_with_key": "unicode/1f510.png?v8",
            "closed_umbrella": "unicode/1f302.png?v8",
            "cloud": "unicode/2601.png?v8",
            "cloud_with_lightning": "unicode/1f329.png?v8",
            "cloud_with_lightning_and_rain": "unicode/26c8.png?v8",
            "cloud_with_rain": "unicode/1f327.png?v8",
            "cloud_with_snow": "unicode/1f328.png?v8",
            "clown_face": "unicode/1f921.png?v8",
            "clubs": "unicode/2663.png?v8",
            "cn": "unicode/1f1e8-1f1f3.png?v8",
            "coat": "unicode/1f9e5.png?v8",
            "cockroach": "unicode/1fab3.png?v8",
            "cocktail": "unicode/1f378.png?v8",
            "coconut": "unicode/1f965.png?v8",
            "cocos_islands": "unicode/1f1e8-1f1e8.png?v8",
            "coffee": "unicode/2615.png?v8",
            "coffin": "unicode/26b0.png?v8",
            "coin": "unicode/1fa99.png?v8",
            "cold_face": "unicode/1f976.png?v8",
            "cold_sweat": "unicode/1f630.png?v8",
            "collision": "unicode/1f4a5.png?v8",
            "colombia": "unicode/1f1e8-1f1f4.png?v8",
            "comet": "unicode/2604.png?v8",
            "comoros": "unicode/1f1f0-1f1f2.png?v8",
            "compass": "unicode/1f9ed.png?v8",
            "computer": "unicode/1f4bb.png?v8",
            "computer_mouse": "unicode/1f5b1.png?v8",
            "confetti_ball": "unicode/1f38a.png?v8",
            "confounded": "unicode/1f616.png?v8",
            "confused": "unicode/1f615.png?v8",
            "congo_brazzaville": "unicode/1f1e8-1f1ec.png?v8",
            "congo_kinshasa": "unicode/1f1e8-1f1e9.png?v8",
            "congratulations": "unicode/3297.png?v8",
            "construction": "unicode/1f6a7.png?v8",
            "construction_worker": "unicode/1f477.png?v8",
            "construction_worker_man": "unicode/1f477-2642.png?v8",
            "construction_worker_woman": "unicode/1f477-2640.png?v8",
            "control_knobs": "unicode/1f39b.png?v8",
            "convenience_store": "unicode/1f3ea.png?v8",
            "cook": "unicode/1f9d1-1f373.png?v8",
            "cook_islands": "unicode/1f1e8-1f1f0.png?v8",
            "cookie": "unicode/1f36a.png?v8",
            "cool": "unicode/1f192.png?v8",
            "cop": "unicode/1f46e.png?v8",
            "copyright": "unicode/00a9.png?v8",
            "corn": "unicode/1f33d.png?v8",
            "costa_rica": "unicode/1f1e8-1f1f7.png?v8",
            "cote_divoire": "unicode/1f1e8-1f1ee.png?v8",
            "couch_and_lamp": "unicode/1f6cb.png?v8",
            "couple": "unicode/1f46b.png?v8",
            "couple_with_heart": "unicode/1f491.png?v8",
            "couple_with_heart_man_man": "unicode/1f468-2764-1f468.png?v8",
            "couple_with_heart_woman_man": "unicode/1f469-2764-1f468.png?v8",
            "couple_with_heart_woman_woman": "unicode/1f469-2764-1f469.png?v8",
            "couplekiss": "unicode/1f48f.png?v8",
            "couplekiss_man_man": "unicode/1f468-2764-1f48b-1f468.png?v8",
            "couplekiss_man_woman": "unicode/1f469-2764-1f48b-1f468.png?v8",
            "couplekiss_woman_woman": "unicode/1f469-2764-1f48b-1f469.png?v8",
            "cow": "unicode/1f42e.png?v8",
            "cow2": "unicode/1f404.png?v8",
            "cowboy_hat_face": "unicode/1f920.png?v8",
            "crab": "unicode/1f980.png?v8",
            "crayon": "unicode/1f58d.png?v8",
            "credit_card": "unicode/1f4b3.png?v8",
            "crescent_moon": "unicode/1f319.png?v8",
            "cricket": "unicode/1f997.png?v8",
            "cricket_game": "unicode/1f3cf.png?v8",
            "croatia": "unicode/1f1ed-1f1f7.png?v8",
            "crocodile": "unicode/1f40a.png?v8",
            "croissant": "unicode/1f950.png?v8",
            "crossed_fingers": "unicode/1f91e.png?v8",
            "crossed_flags": "unicode/1f38c.png?v8",
            "crossed_swords": "unicode/2694.png?v8",
            "crown": "unicode/1f451.png?v8",
            "cry": "unicode/1f622.png?v8",
            "crying_cat_face": "unicode/1f63f.png?v8",
            "crystal_ball": "unicode/1f52e.png?v8",
            "cuba": "unicode/1f1e8-1f1fa.png?v8",
            "cucumber": "unicode/1f952.png?v8",
            "cup_with_straw": "unicode/1f964.png?v8",
            "cupcake": "unicode/1f9c1.png?v8",
            "cupid": "unicode/1f498.png?v8",
            "curacao": "unicode/1f1e8-1f1fc.png?v8",
            "curling_stone": "unicode/1f94c.png?v8",
            "curly_haired_man": "unicode/1f468-1f9b1.png?v8",
            "curly_haired_woman": "unicode/1f469-1f9b1.png?v8",
            "curly_loop": "unicode/27b0.png?v8",
            "currency_exchange": "unicode/1f4b1.png?v8",
            "curry": "unicode/1f35b.png?v8",
            "cursing_face": "unicode/1f92c.png?v8",
            "custard": "unicode/1f36e.png?v8",
            "customs": "unicode/1f6c3.png?v8",
            "cut_of_meat": "unicode/1f969.png?v8",
            "cyclone": "unicode/1f300.png?v8",
            "cyprus": "unicode/1f1e8-1f1fe.png?v8",
            "czech_republic": "unicode/1f1e8-1f1ff.png?v8",
            "dagger": "unicode/1f5e1.png?v8",
            "dancer": "unicode/1f483.png?v8",
            "dancers": "unicode/1f46f.png?v8",
            "dancing_men": "unicode/1f46f-2642.png?v8",
            "dancing_women": "unicode/1f46f-2640.png?v8",
            "dango": "unicode/1f361.png?v8",
            "dark_sunglasses": "unicode/1f576.png?v8",
            "dart": "unicode/1f3af.png?v8",
            "dash": "unicode/1f4a8.png?v8",
            "date": "unicode/1f4c5.png?v8",
            "de": "unicode/1f1e9-1f1ea.png?v8",
            "deaf_man": "unicode/1f9cf-2642.png?v8",
            "deaf_person": "unicode/1f9cf.png?v8",
            "deaf_woman": "unicode/1f9cf-2640.png?v8",
            "deciduous_tree": "unicode/1f333.png?v8",
            "deer": "unicode/1f98c.png?v8",
            "denmark": "unicode/1f1e9-1f1f0.png?v8",
            "department_store": "unicode/1f3ec.png?v8",
            "derelict_house": "unicode/1f3da.png?v8",
            "desert": "unicode/1f3dc.png?v8",
            "desert_island": "unicode/1f3dd.png?v8",
            "desktop_computer": "unicode/1f5a5.png?v8",
            "detective": "unicode/1f575.png?v8",
            "diamond_shape_with_a_dot_inside": "unicode/1f4a0.png?v8",
            "diamonds": "unicode/2666.png?v8",
            "diego_garcia": "unicode/1f1e9-1f1ec.png?v8",
            "disappointed": "unicode/1f61e.png?v8",
            "disappointed_relieved": "unicode/1f625.png?v8",
            "disguised_face": "unicode/1f978.png?v8",
            "diving_mask": "unicode/1f93f.png?v8",
            "diya_lamp": "unicode/1fa94.png?v8",
            "dizzy": "unicode/1f4ab.png?v8",
            "dizzy_face": "unicode/1f635.png?v8",
            "djibouti": "unicode/1f1e9-1f1ef.png?v8",
            "dna": "unicode/1f9ec.png?v8",
            "do_not_litter": "unicode/1f6af.png?v8",
            "dodo": "unicode/1f9a4.png?v8",
            "dog": "unicode/1f436.png?v8",
            "dog2": "unicode/1f415.png?v8",
            "dollar": "unicode/1f4b5.png?v8",
            "dolls": "unicode/1f38e.png?v8",
            "dolphin": "unicode/1f42c.png?v8",
            "dominica": "unicode/1f1e9-1f1f2.png?v8",
            "dominican_republic": "unicode/1f1e9-1f1f4.png?v8",
            "door": "unicode/1f6aa.png?v8",
            "doughnut": "unicode/1f369.png?v8",
            "dove": "unicode/1f54a.png?v8",
            "dragon": "unicode/1f409.png?v8",
            "dragon_face": "unicode/1f432.png?v8",
            "dress": "unicode/1f457.png?v8",
            "dromedary_camel": "unicode/1f42a.png?v8",
            "drooling_face": "unicode/1f924.png?v8",
            "drop_of_blood": "unicode/1fa78.png?v8",
            "droplet": "unicode/1f4a7.png?v8",
            "drum": "unicode/1f941.png?v8",
            "duck": "unicode/1f986.png?v8",
            "dumpling": "unicode/1f95f.png?v8",
            "dvd": "unicode/1f4c0.png?v8",
            "e-mail": "unicode/1f4e7.png?v8",
            "eagle": "unicode/1f985.png?v8",
            "ear": "unicode/1f442.png?v8",
            "ear_of_rice": "unicode/1f33e.png?v8",
            "ear_with_hearing_aid": "unicode/1f9bb.png?v8",
            "earth_africa": "unicode/1f30d.png?v8",
            "earth_americas": "unicode/1f30e.png?v8",
            "earth_asia": "unicode/1f30f.png?v8",
            "ecuador": "unicode/1f1ea-1f1e8.png?v8",
            "egg": "unicode/1f95a.png?v8",
            "eggplant": "unicode/1f346.png?v8",
            "egypt": "unicode/1f1ea-1f1ec.png?v8",
            "eight": "unicode/0038-20e3.png?v8",
            "eight_pointed_black_star": "unicode/2734.png?v8",
            "eight_spoked_asterisk": "unicode/2733.png?v8",
            "eject_button": "unicode/23cf.png?v8",
            "el_salvador": "unicode/1f1f8-1f1fb.png?v8",
            "electric_plug": "unicode/1f50c.png?v8",
            "electron": "electron.png?v8",
            "elephant": "unicode/1f418.png?v8",
            "elevator": "unicode/1f6d7.png?v8",
            "elf": "unicode/1f9dd.png?v8",
            "elf_man": "unicode/1f9dd-2642.png?v8",
            "elf_woman": "unicode/1f9dd-2640.png?v8",
            "email": "unicode/1f4e7.png?v8",
            "end": "unicode/1f51a.png?v8",
            "england": "unicode/1f3f4-e0067-e0062-e0065-e006e-e0067-e007f.png?v8",
            "envelope": "unicode/2709.png?v8",
            "envelope_with_arrow": "unicode/1f4e9.png?v8",
            "equatorial_guinea": "unicode/1f1ec-1f1f6.png?v8",
            "eritrea": "unicode/1f1ea-1f1f7.png?v8",
            "es": "unicode/1f1ea-1f1f8.png?v8",
            "estonia": "unicode/1f1ea-1f1ea.png?v8",
            "ethiopia": "unicode/1f1ea-1f1f9.png?v8",
            "eu": "unicode/1f1ea-1f1fa.png?v8",
            "euro": "unicode/1f4b6.png?v8",
            "european_castle": "unicode/1f3f0.png?v8",
            "european_post_office": "unicode/1f3e4.png?v8",
            "european_union": "unicode/1f1ea-1f1fa.png?v8",
            "evergreen_tree": "unicode/1f332.png?v8",
            "exclamation": "unicode/2757.png?v8",
            "exploding_head": "unicode/1f92f.png?v8",
            "expressionless": "unicode/1f611.png?v8",
            "eye": "unicode/1f441.png?v8",
            "eye_speech_bubble": "unicode/1f441-1f5e8.png?v8",
            "eyeglasses": "unicode/1f453.png?v8",
            "eyes": "unicode/1f440.png?v8",
            "face_exhaling": "unicode/1f62e-1f4a8.png?v8",
            "face_in_clouds": "unicode/1f636-1f32b.png?v8",
            "face_with_head_bandage": "unicode/1f915.png?v8",
            "face_with_spiral_eyes": "unicode/1f635-1f4ab.png?v8",
            "face_with_thermometer": "unicode/1f912.png?v8",
            "facepalm": "unicode/1f926.png?v8",
            "facepunch": "unicode/1f44a.png?v8",
            "factory": "unicode/1f3ed.png?v8",
            "factory_worker": "unicode/1f9d1-1f3ed.png?v8",
            "fairy": "unicode/1f9da.png?v8",
            "fairy_man": "unicode/1f9da-2642.png?v8",
            "fairy_woman": "unicode/1f9da-2640.png?v8",
            "falafel": "unicode/1f9c6.png?v8",
            "falkland_islands": "unicode/1f1eb-1f1f0.png?v8",
            "fallen_leaf": "unicode/1f342.png?v8",
            "family": "unicode/1f46a.png?v8",
            "family_man_boy": "unicode/1f468-1f466.png?v8",
            "family_man_boy_boy": "unicode/1f468-1f466-1f466.png?v8",
            "family_man_girl": "unicode/1f468-1f467.png?v8",
            "family_man_girl_boy": "unicode/1f468-1f467-1f466.png?v8",
            "family_man_girl_girl": "unicode/1f468-1f467-1f467.png?v8",
            "family_man_man_boy": "unicode/1f468-1f468-1f466.png?v8",
            "family_man_man_boy_boy": "unicode/1f468-1f468-1f466-1f466.png?v8",
            "family_man_man_girl": "unicode/1f468-1f468-1f467.png?v8",
            "family_man_man_girl_boy": "unicode/1f468-1f468-1f467-1f466.png?v8",
            "family_man_man_girl_girl": "unicode/1f468-1f468-1f467-1f467.png?v8",
            "family_man_woman_boy": "unicode/1f468-1f469-1f466.png?v8",
            "family_man_woman_boy_boy": "unicode/1f468-1f469-1f466-1f466.png?v8",
            "family_man_woman_girl": "unicode/1f468-1f469-1f467.png?v8",
            "family_man_woman_girl_boy": "unicode/1f468-1f469-1f467-1f466.png?v8",
            "family_man_woman_girl_girl": "unicode/1f468-1f469-1f467-1f467.png?v8",
            "family_woman_boy": "unicode/1f469-1f466.png?v8",
            "family_woman_boy_boy": "unicode/1f469-1f466-1f466.png?v8",
            "family_woman_girl": "unicode/1f469-1f467.png?v8",
            "family_woman_girl_boy": "unicode/1f469-1f467-1f466.png?v8",
            "family_woman_girl_girl": "unicode/1f469-1f467-1f467.png?v8",
            "family_woman_woman_boy": "unicode/1f469-1f469-1f466.png?v8",
            "family_woman_woman_boy_boy": "unicode/1f469-1f469-1f466-1f466.png?v8",
            "family_woman_woman_girl": "unicode/1f469-1f469-1f467.png?v8",
            "family_woman_woman_girl_boy": "unicode/1f469-1f469-1f467-1f466.png?v8",
            "family_woman_woman_girl_girl": "unicode/1f469-1f469-1f467-1f467.png?v8",
            "farmer": "unicode/1f9d1-1f33e.png?v8",
            "faroe_islands": "unicode/1f1eb-1f1f4.png?v8",
            "fast_forward": "unicode/23e9.png?v8",
            "fax": "unicode/1f4e0.png?v8",
            "fearful": "unicode/1f628.png?v8",
            "feather": "unicode/1fab6.png?v8",
            "feelsgood": "feelsgood.png?v8",
            "feet": "unicode/1f43e.png?v8",
            "female_detective": "unicode/1f575-2640.png?v8",
            "female_sign": "unicode/2640.png?v8",
            "ferris_wheel": "unicode/1f3a1.png?v8",
            "ferry": "unicode/26f4.png?v8",
            "field_hockey": "unicode/1f3d1.png?v8",
            "fiji": "unicode/1f1eb-1f1ef.png?v8",
            "file_cabinet": "unicode/1f5c4.png?v8",
            "file_folder": "unicode/1f4c1.png?v8",
            "film_projector": "unicode/1f4fd.png?v8",
            "film_strip": "unicode/1f39e.png?v8",
            "finland": "unicode/1f1eb-1f1ee.png?v8",
            "finnadie": "finnadie.png?v8",
            "fire": "unicode/1f525.png?v8",
            "fire_engine": "unicode/1f692.png?v8",
            "fire_extinguisher": "unicode/1f9ef.png?v8",
            "firecracker": "unicode/1f9e8.png?v8",
            "firefighter": "unicode/1f9d1-1f692.png?v8",
            "fireworks": "unicode/1f386.png?v8",
            "first_quarter_moon": "unicode/1f313.png?v8",
            "first_quarter_moon_with_face": "unicode/1f31b.png?v8",
            "fish": "unicode/1f41f.png?v8",
            "fish_cake": "unicode/1f365.png?v8",
            "fishing_pole_and_fish": "unicode/1f3a3.png?v8",
            "fist": "unicode/270a.png?v8",
            "fist_left": "unicode/1f91b.png?v8",
            "fist_oncoming": "unicode/1f44a.png?v8",
            "fist_raised": "unicode/270a.png?v8",
            "fist_right": "unicode/1f91c.png?v8",
            "five": "unicode/0035-20e3.png?v8",
            "flags": "unicode/1f38f.png?v8",
            "flamingo": "unicode/1f9a9.png?v8",
            "flashlight": "unicode/1f526.png?v8",
            "flat_shoe": "unicode/1f97f.png?v8",
            "flatbread": "unicode/1fad3.png?v8",
            "fleur_de_lis": "unicode/269c.png?v8",
            "flight_arrival": "unicode/1f6ec.png?v8",
            "flight_departure": "unicode/1f6eb.png?v8",
            "flipper": "unicode/1f42c.png?v8",
            "floppy_disk": "unicode/1f4be.png?v8",
            "flower_playing_cards": "unicode/1f3b4.png?v8",
            "flushed": "unicode/1f633.png?v8",
            "fly": "unicode/1fab0.png?v8",
            "flying_disc": "unicode/1f94f.png?v8",
            "flying_saucer": "unicode/1f6f8.png?v8",
            "fog": "unicode/1f32b.png?v8",
            "foggy": "unicode/1f301.png?v8",
            "fondue": "unicode/1fad5.png?v8",
            "foot": "unicode/1f9b6.png?v8",
            "football": "unicode/1f3c8.png?v8",
            "footprints": "unicode/1f463.png?v8",
            "fork_and_knife": "unicode/1f374.png?v8",
            "fortune_cookie": "unicode/1f960.png?v8",
            "fountain": "unicode/26f2.png?v8",
            "fountain_pen": "unicode/1f58b.png?v8",
            "four": "unicode/0034-20e3.png?v8",
            "four_leaf_clover": "unicode/1f340.png?v8",
            "fox_face": "unicode/1f98a.png?v8",
            "fr": "unicode/1f1eb-1f1f7.png?v8",
            "framed_picture": "unicode/1f5bc.png?v8",
            "free": "unicode/1f193.png?v8",
            "french_guiana": "unicode/1f1ec-1f1eb.png?v8",
            "french_polynesia": "unicode/1f1f5-1f1eb.png?v8",
            "french_southern_territories": "unicode/1f1f9-1f1eb.png?v8",
            "fried_egg": "unicode/1f373.png?v8",
            "fried_shrimp": "unicode/1f364.png?v8",
            "fries": "unicode/1f35f.png?v8",
            "frog": "unicode/1f438.png?v8",
            "frowning": "unicode/1f626.png?v8",
            "frowning_face": "unicode/2639.png?v8",
            "frowning_man": "unicode/1f64d-2642.png?v8",
            "frowning_person": "unicode/1f64d.png?v8",
            "frowning_woman": "unicode/1f64d-2640.png?v8",
            "fu": "unicode/1f595.png?v8",
            "fuelpump": "unicode/26fd.png?v8",
            "full_moon": "unicode/1f315.png?v8",
            "full_moon_with_face": "unicode/1f31d.png?v8",
            "funeral_urn": "unicode/26b1.png?v8",
            "gabon": "unicode/1f1ec-1f1e6.png?v8",
            "gambia": "unicode/1f1ec-1f1f2.png?v8",
            "game_die": "unicode/1f3b2.png?v8",
            "garlic": "unicode/1f9c4.png?v8",
            "gb": "unicode/1f1ec-1f1e7.png?v8",
            "gear": "unicode/2699.png?v8",
            "gem": "unicode/1f48e.png?v8",
            "gemini": "unicode/264a.png?v8",
            "genie": "unicode/1f9de.png?v8",
            "genie_man": "unicode/1f9de-2642.png?v8",
            "genie_woman": "unicode/1f9de-2640.png?v8",
            "georgia": "unicode/1f1ec-1f1ea.png?v8",
            "ghana": "unicode/1f1ec-1f1ed.png?v8",
            "ghost": "unicode/1f47b.png?v8",
            "gibraltar": "unicode/1f1ec-1f1ee.png?v8",
            "gift": "unicode/1f381.png?v8",
            "gift_heart": "unicode/1f49d.png?v8",
            "giraffe": "unicode/1f992.png?v8",
            "girl": "unicode/1f467.png?v8",
            "globe_with_meridians": "unicode/1f310.png?v8",
            "gloves": "unicode/1f9e4.png?v8",
            "goal_net": "unicode/1f945.png?v8",
            "goat": "unicode/1f410.png?v8",
            "goberserk": "goberserk.png?v8",
            "godmode": "godmode.png?v8",
            "goggles": "unicode/1f97d.png?v8",
            "golf": "unicode/26f3.png?v8",
            "golfing": "unicode/1f3cc.png?v8",
            "golfing_man": "unicode/1f3cc-2642.png?v8",
            "golfing_woman": "unicode/1f3cc-2640.png?v8",
            "gorilla": "unicode/1f98d.png?v8",
            "grapes": "unicode/1f347.png?v8",
            "greece": "unicode/1f1ec-1f1f7.png?v8",
            "green_apple": "unicode/1f34f.png?v8",
            "green_book": "unicode/1f4d7.png?v8",
            "green_circle": "unicode/1f7e2.png?v8",
            "green_heart": "unicode/1f49a.png?v8",
            "green_salad": "unicode/1f957.png?v8",
            "green_square": "unicode/1f7e9.png?v8",
            "greenland": "unicode/1f1ec-1f1f1.png?v8",
            "grenada": "unicode/1f1ec-1f1e9.png?v8",
            "grey_exclamation": "unicode/2755.png?v8",
            "grey_question": "unicode/2754.png?v8",
            "grimacing": "unicode/1f62c.png?v8",
            "grin": "unicode/1f601.png?v8",
            "grinning": "unicode/1f600.png?v8",
            "guadeloupe": "unicode/1f1ec-1f1f5.png?v8",
            "guam": "unicode/1f1ec-1f1fa.png?v8",
            "guard": "unicode/1f482.png?v8",
            "guardsman": "unicode/1f482-2642.png?v8",
            "guardswoman": "unicode/1f482-2640.png?v8",
            "guatemala": "unicode/1f1ec-1f1f9.png?v8",
            "guernsey": "unicode/1f1ec-1f1ec.png?v8",
            "guide_dog": "unicode/1f9ae.png?v8",
            "guinea": "unicode/1f1ec-1f1f3.png?v8",
            "guinea_bissau": "unicode/1f1ec-1f1fc.png?v8",
            "guitar": "unicode/1f3b8.png?v8",
            "gun": "unicode/1f52b.png?v8",
            "guyana": "unicode/1f1ec-1f1fe.png?v8",
            "haircut": "unicode/1f487.png?v8",
            "haircut_man": "unicode/1f487-2642.png?v8",
            "haircut_woman": "unicode/1f487-2640.png?v8",
            "haiti": "unicode/1f1ed-1f1f9.png?v8",
            "hamburger": "unicode/1f354.png?v8",
            "hammer": "unicode/1f528.png?v8",
            "hammer_and_pick": "unicode/2692.png?v8",
            "hammer_and_wrench": "unicode/1f6e0.png?v8",
            "hamster": "unicode/1f439.png?v8",
            "hand": "unicode/270b.png?v8",
            "hand_over_mouth": "unicode/1f92d.png?v8",
            "handbag": "unicode/1f45c.png?v8",
            "handball_person": "unicode/1f93e.png?v8",
            "handshake": "unicode/1f91d.png?v8",
            "hankey": "unicode/1f4a9.png?v8",
            "hash": "unicode/0023-20e3.png?v8",
            "hatched_chick": "unicode/1f425.png?v8",
            "hatching_chick": "unicode/1f423.png?v8",
            "headphones": "unicode/1f3a7.png?v8",
            "headstone": "unicode/1faa6.png?v8",
            "health_worker": "unicode/1f9d1-2695.png?v8",
            "hear_no_evil": "unicode/1f649.png?v8",
            "heard_mcdonald_islands": "unicode/1f1ed-1f1f2.png?v8",
            "heart": "unicode/2764.png?v8",
            "heart_decoration": "unicode/1f49f.png?v8",
            "heart_eyes": "unicode/1f60d.png?v8",
            "heart_eyes_cat": "unicode/1f63b.png?v8",
            "heart_on_fire": "unicode/2764-1f525.png?v8",
            "heartbeat": "unicode/1f493.png?v8",
            "heartpulse": "unicode/1f497.png?v8",
            "hearts": "unicode/2665.png?v8",
            "heavy_check_mark": "unicode/2714.png?v8",
            "heavy_division_sign": "unicode/2797.png?v8",
            "heavy_dollar_sign": "unicode/1f4b2.png?v8",
            "heavy_exclamation_mark": "unicode/2757.png?v8",
            "heavy_heart_exclamation": "unicode/2763.png?v8",
            "heavy_minus_sign": "unicode/2796.png?v8",
            "heavy_multiplication_x": "unicode/2716.png?v8",
            "heavy_plus_sign": "unicode/2795.png?v8",
            "hedgehog": "unicode/1f994.png?v8",
            "helicopter": "unicode/1f681.png?v8",
            "herb": "unicode/1f33f.png?v8",
            "hibiscus": "unicode/1f33a.png?v8",
            "high_brightness": "unicode/1f506.png?v8",
            "high_heel": "unicode/1f460.png?v8",
            "hiking_boot": "unicode/1f97e.png?v8",
            "hindu_temple": "unicode/1f6d5.png?v8",
            "hippopotamus": "unicode/1f99b.png?v8",
            "hocho": "unicode/1f52a.png?v8",
            "hole": "unicode/1f573.png?v8",
            "honduras": "unicode/1f1ed-1f1f3.png?v8",
            "honey_pot": "unicode/1f36f.png?v8",
            "honeybee": "unicode/1f41d.png?v8",
            "hong_kong": "unicode/1f1ed-1f1f0.png?v8",
            "hook": "unicode/1fa9d.png?v8",
            "horse": "unicode/1f434.png?v8",
            "horse_racing": "unicode/1f3c7.png?v8",
            "hospital": "unicode/1f3e5.png?v8",
            "hot_face": "unicode/1f975.png?v8",
            "hot_pepper": "unicode/1f336.png?v8",
            "hotdog": "unicode/1f32d.png?v8",
            "hotel": "unicode/1f3e8.png?v8",
            "hotsprings": "unicode/2668.png?v8",
            "hourglass": "unicode/231b.png?v8",
            "hourglass_flowing_sand": "unicode/23f3.png?v8",
            "house": "unicode/1f3e0.png?v8",
            "house_with_garden": "unicode/1f3e1.png?v8",
            "houses": "unicode/1f3d8.png?v8",
            "hugs": "unicode/1f917.png?v8",
            "hungary": "unicode/1f1ed-1f1fa.png?v8",
            "hurtrealbad": "hurtrealbad.png?v8",
            "hushed": "unicode/1f62f.png?v8",
            "hut": "unicode/1f6d6.png?v8",
            "ice_cream": "unicode/1f368.png?v8",
            "ice_cube": "unicode/1f9ca.png?v8",
            "ice_hockey": "unicode/1f3d2.png?v8",
            "ice_skate": "unicode/26f8.png?v8",
            "icecream": "unicode/1f366.png?v8",
            "iceland": "unicode/1f1ee-1f1f8.png?v8",
            "id": "unicode/1f194.png?v8",
            "ideograph_advantage": "unicode/1f250.png?v8",
            "imp": "unicode/1f47f.png?v8",
            "inbox_tray": "unicode/1f4e5.png?v8",
            "incoming_envelope": "unicode/1f4e8.png?v8",
            "india": "unicode/1f1ee-1f1f3.png?v8",
            "indonesia": "unicode/1f1ee-1f1e9.png?v8",
            "infinity": "unicode/267e.png?v8",
            "information_desk_person": "unicode/1f481.png?v8",
            "information_source": "unicode/2139.png?v8",
            "innocent": "unicode/1f607.png?v8",
            "interrobang": "unicode/2049.png?v8",
            "iphone": "unicode/1f4f1.png?v8",
            "iran": "unicode/1f1ee-1f1f7.png?v8",
            "iraq": "unicode/1f1ee-1f1f6.png?v8",
            "ireland": "unicode/1f1ee-1f1ea.png?v8",
            "isle_of_man": "unicode/1f1ee-1f1f2.png?v8",
            "israel": "unicode/1f1ee-1f1f1.png?v8",
            "it": "unicode/1f1ee-1f1f9.png?v8",
            "izakaya_lantern": "unicode/1f3ee.png?v8",
            "jack_o_lantern": "unicode/1f383.png?v8",
            "jamaica": "unicode/1f1ef-1f1f2.png?v8",
            "japan": "unicode/1f5fe.png?v8",
            "japanese_castle": "unicode/1f3ef.png?v8",
            "japanese_goblin": "unicode/1f47a.png?v8",
            "japanese_ogre": "unicode/1f479.png?v8",
            "jeans": "unicode/1f456.png?v8",
            "jersey": "unicode/1f1ef-1f1ea.png?v8",
            "jigsaw": "unicode/1f9e9.png?v8",
            "jordan": "unicode/1f1ef-1f1f4.png?v8",
            "joy": "unicode/1f602.png?v8",
            "joy_cat": "unicode/1f639.png?v8",
            "joystick": "unicode/1f579.png?v8",
            "jp": "unicode/1f1ef-1f1f5.png?v8",
            "judge": "unicode/1f9d1-2696.png?v8",
            "juggling_person": "unicode/1f939.png?v8",
            "kaaba": "unicode/1f54b.png?v8",
            "kangaroo": "unicode/1f998.png?v8",
            "kazakhstan": "unicode/1f1f0-1f1ff.png?v8",
            "kenya": "unicode/1f1f0-1f1ea.png?v8",
            "key": "unicode/1f511.png?v8",
            "keyboard": "unicode/2328.png?v8",
            "keycap_ten": "unicode/1f51f.png?v8",
            "kick_scooter": "unicode/1f6f4.png?v8",
            "kimono": "unicode/1f458.png?v8",
            "kiribati": "unicode/1f1f0-1f1ee.png?v8",
            "kiss": "unicode/1f48b.png?v8",
            "kissing": "unicode/1f617.png?v8",
            "kissing_cat": "unicode/1f63d.png?v8",
            "kissing_closed_eyes": "unicode/1f61a.png?v8",
            "kissing_heart": "unicode/1f618.png?v8",
            "kissing_smiling_eyes": "unicode/1f619.png?v8",
            "kite": "unicode/1fa81.png?v8",
            "kiwi_fruit": "unicode/1f95d.png?v8",
            "kneeling_man": "unicode/1f9ce-2642.png?v8",
            "kneeling_person": "unicode/1f9ce.png?v8",
            "kneeling_woman": "unicode/1f9ce-2640.png?v8",
            "knife": "unicode/1f52a.png?v8",
            "knot": "unicode/1faa2.png?v8",
            "koala": "unicode/1f428.png?v8",
            "koko": "unicode/1f201.png?v8",
            "kosovo": "unicode/1f1fd-1f1f0.png?v8",
            "kr": "unicode/1f1f0-1f1f7.png?v8",
            "kuwait": "unicode/1f1f0-1f1fc.png?v8",
            "kyrgyzstan": "unicode/1f1f0-1f1ec.png?v8",
            "lab_coat": "unicode/1f97c.png?v8",
            "label": "unicode/1f3f7.png?v8",
            "lacrosse": "unicode/1f94d.png?v8",
            "ladder": "unicode/1fa9c.png?v8",
            "lady_beetle": "unicode/1f41e.png?v8",
            "lantern": "unicode/1f3ee.png?v8",
            "laos": "unicode/1f1f1-1f1e6.png?v8",
            "large_blue_circle": "unicode/1f535.png?v8",
            "large_blue_diamond": "unicode/1f537.png?v8",
            "large_orange_diamond": "unicode/1f536.png?v8",
            "last_quarter_moon": "unicode/1f317.png?v8",
            "last_quarter_moon_with_face": "unicode/1f31c.png?v8",
            "latin_cross": "unicode/271d.png?v8",
            "latvia": "unicode/1f1f1-1f1fb.png?v8",
            "laughing": "unicode/1f606.png?v8",
            "leafy_green": "unicode/1f96c.png?v8",
            "leaves": "unicode/1f343.png?v8",
            "lebanon": "unicode/1f1f1-1f1e7.png?v8",
            "ledger": "unicode/1f4d2.png?v8",
            "left_luggage": "unicode/1f6c5.png?v8",
            "left_right_arrow": "unicode/2194.png?v8",
            "left_speech_bubble": "unicode/1f5e8.png?v8",
            "leftwards_arrow_with_hook": "unicode/21a9.png?v8",
            "leg": "unicode/1f9b5.png?v8",
            "lemon": "unicode/1f34b.png?v8",
            "leo": "unicode/264c.png?v8",
            "leopard": "unicode/1f406.png?v8",
            "lesotho": "unicode/1f1f1-1f1f8.png?v8",
            "level_slider": "unicode/1f39a.png?v8",
            "liberia": "unicode/1f1f1-1f1f7.png?v8",
            "libra": "unicode/264e.png?v8",
            "libya": "unicode/1f1f1-1f1fe.png?v8",
            "liechtenstein": "unicode/1f1f1-1f1ee.png?v8",
            "light_rail": "unicode/1f688.png?v8",
            "link": "unicode/1f517.png?v8",
            "lion": "unicode/1f981.png?v8",
            "lips": "unicode/1f444.png?v8",
            "lipstick": "unicode/1f484.png?v8",
            "lithuania": "unicode/1f1f1-1f1f9.png?v8",
            "lizard": "unicode/1f98e.png?v8",
            "llama": "unicode/1f999.png?v8",
            "lobster": "unicode/1f99e.png?v8",
            "lock": "unicode/1f512.png?v8",
            "lock_with_ink_pen": "unicode/1f50f.png?v8",
            "lollipop": "unicode/1f36d.png?v8",
            "long_drum": "unicode/1fa98.png?v8",
            "loop": "unicode/27bf.png?v8",
            "lotion_bottle": "unicode/1f9f4.png?v8",
            "lotus_position": "unicode/1f9d8.png?v8",
            "lotus_position_man": "unicode/1f9d8-2642.png?v8",
            "lotus_position_woman": "unicode/1f9d8-2640.png?v8",
            "loud_sound": "unicode/1f50a.png?v8",
            "loudspeaker": "unicode/1f4e2.png?v8",
            "love_hotel": "unicode/1f3e9.png?v8",
            "love_letter": "unicode/1f48c.png?v8",
            "love_you_gesture": "unicode/1f91f.png?v8",
            "low_brightness": "unicode/1f505.png?v8",
            "luggage": "unicode/1f9f3.png?v8",
            "lungs": "unicode/1fac1.png?v8",
            "luxembourg": "unicode/1f1f1-1f1fa.png?v8",
            "lying_face": "unicode/1f925.png?v8",
            "m": "unicode/24c2.png?v8",
            "macau": "unicode/1f1f2-1f1f4.png?v8",
            "macedonia": "unicode/1f1f2-1f1f0.png?v8",
            "madagascar": "unicode/1f1f2-1f1ec.png?v8",
            "mag": "unicode/1f50d.png?v8",
            "mag_right": "unicode/1f50e.png?v8",
            "mage": "unicode/1f9d9.png?v8",
            "mage_man": "unicode/1f9d9-2642.png?v8",
            "mage_woman": "unicode/1f9d9-2640.png?v8",
            "magic_wand": "unicode/1fa84.png?v8",
            "magnet": "unicode/1f9f2.png?v8",
            "mahjong": "unicode/1f004.png?v8",
            "mailbox": "unicode/1f4eb.png?v8",
            "mailbox_closed": "unicode/1f4ea.png?v8",
            "mailbox_with_mail": "unicode/1f4ec.png?v8",
            "mailbox_with_no_mail": "unicode/1f4ed.png?v8",
            "malawi": "unicode/1f1f2-1f1fc.png?v8",
            "malaysia": "unicode/1f1f2-1f1fe.png?v8",
            "maldives": "unicode/1f1f2-1f1fb.png?v8",
            "male_detective": "unicode/1f575-2642.png?v8",
            "male_sign": "unicode/2642.png?v8",
            "mali": "unicode/1f1f2-1f1f1.png?v8",
            "malta": "unicode/1f1f2-1f1f9.png?v8",
            "mammoth": "unicode/1f9a3.png?v8",
            "man": "unicode/1f468.png?v8",
            "man_artist": "unicode/1f468-1f3a8.png?v8",
            "man_astronaut": "unicode/1f468-1f680.png?v8",
            "man_beard": "unicode/1f9d4-2642.png?v8",
            "man_cartwheeling": "unicode/1f938-2642.png?v8",
            "man_cook": "unicode/1f468-1f373.png?v8",
            "man_dancing": "unicode/1f57a.png?v8",
            "man_facepalming": "unicode/1f926-2642.png?v8",
            "man_factory_worker": "unicode/1f468-1f3ed.png?v8",
            "man_farmer": "unicode/1f468-1f33e.png?v8",
            "man_feeding_baby": "unicode/1f468-1f37c.png?v8",
            "man_firefighter": "unicode/1f468-1f692.png?v8",
            "man_health_worker": "unicode/1f468-2695.png?v8",
            "man_in_manual_wheelchair": "unicode/1f468-1f9bd.png?v8",
            "man_in_motorized_wheelchair": "unicode/1f468-1f9bc.png?v8",
            "man_in_tuxedo": "unicode/1f935-2642.png?v8",
            "man_judge": "unicode/1f468-2696.png?v8",
            "man_juggling": "unicode/1f939-2642.png?v8",
            "man_mechanic": "unicode/1f468-1f527.png?v8",
            "man_office_worker": "unicode/1f468-1f4bc.png?v8",
            "man_pilot": "unicode/1f468-2708.png?v8",
            "man_playing_handball": "unicode/1f93e-2642.png?v8",
            "man_playing_water_polo": "unicode/1f93d-2642.png?v8",
            "man_scientist": "unicode/1f468-1f52c.png?v8",
            "man_shrugging": "unicode/1f937-2642.png?v8",
            "man_singer": "unicode/1f468-1f3a4.png?v8",
            "man_student": "unicode/1f468-1f393.png?v8",
            "man_teacher": "unicode/1f468-1f3eb.png?v8",
            "man_technologist": "unicode/1f468-1f4bb.png?v8",
            "man_with_gua_pi_mao": "unicode/1f472.png?v8",
            "man_with_probing_cane": "unicode/1f468-1f9af.png?v8",
            "man_with_turban": "unicode/1f473-2642.png?v8",
            "man_with_veil": "unicode/1f470-2642.png?v8",
            "mandarin": "unicode/1f34a.png?v8",
            "mango": "unicode/1f96d.png?v8",
            "mans_shoe": "unicode/1f45e.png?v8",
            "mantelpiece_clock": "unicode/1f570.png?v8",
            "manual_wheelchair": "unicode/1f9bd.png?v8",
            "maple_leaf": "unicode/1f341.png?v8",
            "marshall_islands": "unicode/1f1f2-1f1ed.png?v8",
            "martial_arts_uniform": "unicode/1f94b.png?v8",
            "martinique": "unicode/1f1f2-1f1f6.png?v8",
            "mask": "unicode/1f637.png?v8",
            "massage": "unicode/1f486.png?v8",
            "massage_man": "unicode/1f486-2642.png?v8",
            "massage_woman": "unicode/1f486-2640.png?v8",
            "mate": "unicode/1f9c9.png?v8",
            "mauritania": "unicode/1f1f2-1f1f7.png?v8",
            "mauritius": "unicode/1f1f2-1f1fa.png?v8",
            "mayotte": "unicode/1f1fe-1f1f9.png?v8",
            "meat_on_bone": "unicode/1f356.png?v8",
            "mechanic": "unicode/1f9d1-1f527.png?v8",
            "mechanical_arm": "unicode/1f9be.png?v8",
            "mechanical_leg": "unicode/1f9bf.png?v8",
            "medal_military": "unicode/1f396.png?v8",
            "medal_sports": "unicode/1f3c5.png?v8",
            "medical_symbol": "unicode/2695.png?v8",
            "mega": "unicode/1f4e3.png?v8",
            "melon": "unicode/1f348.png?v8",
            "memo": "unicode/1f4dd.png?v8",
            "men_wrestling": "unicode/1f93c-2642.png?v8",
            "mending_heart": "unicode/2764-1fa79.png?v8",
            "menorah": "unicode/1f54e.png?v8",
            "mens": "unicode/1f6b9.png?v8",
            "mermaid": "unicode/1f9dc-2640.png?v8",
            "merman": "unicode/1f9dc-2642.png?v8",
            "merperson": "unicode/1f9dc.png?v8",
            "metal": "unicode/1f918.png?v8",
            "metro": "unicode/1f687.png?v8",
            "mexico": "unicode/1f1f2-1f1fd.png?v8",
            "microbe": "unicode/1f9a0.png?v8",
            "micronesia": "unicode/1f1eb-1f1f2.png?v8",
            "microphone": "unicode/1f3a4.png?v8",
            "microscope": "unicode/1f52c.png?v8",
            "middle_finger": "unicode/1f595.png?v8",
            "military_helmet": "unicode/1fa96.png?v8",
            "milk_glass": "unicode/1f95b.png?v8",
            "milky_way": "unicode/1f30c.png?v8",
            "minibus": "unicode/1f690.png?v8",
            "minidisc": "unicode/1f4bd.png?v8",
            "mirror": "unicode/1fa9e.png?v8",
            "mobile_phone_off": "unicode/1f4f4.png?v8",
            "moldova": "unicode/1f1f2-1f1e9.png?v8",
            "monaco": "unicode/1f1f2-1f1e8.png?v8",
            "money_mouth_face": "unicode/1f911.png?v8",
            "money_with_wings": "unicode/1f4b8.png?v8",
            "moneybag": "unicode/1f4b0.png?v8",
            "mongolia": "unicode/1f1f2-1f1f3.png?v8",
            "monkey": "unicode/1f412.png?v8",
            "monkey_face": "unicode/1f435.png?v8",
            "monocle_face": "unicode/1f9d0.png?v8",
            "monorail": "unicode/1f69d.png?v8",
            "montenegro": "unicode/1f1f2-1f1ea.png?v8",
            "montserrat": "unicode/1f1f2-1f1f8.png?v8",
            "moon": "unicode/1f314.png?v8",
            "moon_cake": "unicode/1f96e.png?v8",
            "morocco": "unicode/1f1f2-1f1e6.png?v8",
            "mortar_board": "unicode/1f393.png?v8",
            "mosque": "unicode/1f54c.png?v8",
            "mosquito": "unicode/1f99f.png?v8",
            "motor_boat": "unicode/1f6e5.png?v8",
            "motor_scooter": "unicode/1f6f5.png?v8",
            "motorcycle": "unicode/1f3cd.png?v8",
            "motorized_wheelchair": "unicode/1f9bc.png?v8",
            "motorway": "unicode/1f6e3.png?v8",
            "mount_fuji": "unicode/1f5fb.png?v8",
            "mountain": "unicode/26f0.png?v8",
            "mountain_bicyclist": "unicode/1f6b5.png?v8",
            "mountain_biking_man": "unicode/1f6b5-2642.png?v8",
            "mountain_biking_woman": "unicode/1f6b5-2640.png?v8",
            "mountain_cableway": "unicode/1f6a0.png?v8",
            "mountain_railway": "unicode/1f69e.png?v8",
            "mountain_snow": "unicode/1f3d4.png?v8",
            "mouse": "unicode/1f42d.png?v8",
            "mouse2": "unicode/1f401.png?v8",
            "mouse_trap": "unicode/1faa4.png?v8",
            "movie_camera": "unicode/1f3a5.png?v8",
            "moyai": "unicode/1f5ff.png?v8",
            "mozambique": "unicode/1f1f2-1f1ff.png?v8",
            "mrs_claus": "unicode/1f936.png?v8",
            "muscle": "unicode/1f4aa.png?v8",
            "mushroom": "unicode/1f344.png?v8",
            "musical_keyboard": "unicode/1f3b9.png?v8",
            "musical_note": "unicode/1f3b5.png?v8",
            "musical_score": "unicode/1f3bc.png?v8",
            "mute": "unicode/1f507.png?v8",
            "mx_claus": "unicode/1f9d1-1f384.png?v8",
            "myanmar": "unicode/1f1f2-1f1f2.png?v8",
            "nail_care": "unicode/1f485.png?v8",
            "name_badge": "unicode/1f4db.png?v8",
            "namibia": "unicode/1f1f3-1f1e6.png?v8",
            "national_park": "unicode/1f3de.png?v8",
            "nauru": "unicode/1f1f3-1f1f7.png?v8",
            "nauseated_face": "unicode/1f922.png?v8",
            "nazar_amulet": "unicode/1f9ff.png?v8",
            "neckbeard": "neckbeard.png?v8",
            "necktie": "unicode/1f454.png?v8",
            "negative_squared_cross_mark": "unicode/274e.png?v8",
            "nepal": "unicode/1f1f3-1f1f5.png?v8",
            "nerd_face": "unicode/1f913.png?v8",
            "nesting_dolls": "unicode/1fa86.png?v8",
            "netherlands": "unicode/1f1f3-1f1f1.png?v8",
            "neutral_face": "unicode/1f610.png?v8",
            "new": "unicode/1f195.png?v8",
            "new_caledonia": "unicode/1f1f3-1f1e8.png?v8",
            "new_moon": "unicode/1f311.png?v8",
            "new_moon_with_face": "unicode/1f31a.png?v8",
            "new_zealand": "unicode/1f1f3-1f1ff.png?v8",
            "newspaper": "unicode/1f4f0.png?v8",
            "newspaper_roll": "unicode/1f5de.png?v8",
            "next_track_button": "unicode/23ed.png?v8",
            "ng": "unicode/1f196.png?v8",
            "ng_man": "unicode/1f645-2642.png?v8",
            "ng_woman": "unicode/1f645-2640.png?v8",
            "nicaragua": "unicode/1f1f3-1f1ee.png?v8",
            "niger": "unicode/1f1f3-1f1ea.png?v8",
            "nigeria": "unicode/1f1f3-1f1ec.png?v8",
            "night_with_stars": "unicode/1f303.png?v8",
            "nine": "unicode/0039-20e3.png?v8",
            "ninja": "unicode/1f977.png?v8",
            "niue": "unicode/1f1f3-1f1fa.png?v8",
            "no_bell": "unicode/1f515.png?v8",
            "no_bicycles": "unicode/1f6b3.png?v8",
            "no_entry": "unicode/26d4.png?v8",
            "no_entry_sign": "unicode/1f6ab.png?v8",
            "no_good": "unicode/1f645.png?v8",
            "no_good_man": "unicode/1f645-2642.png?v8",
            "no_good_woman": "unicode/1f645-2640.png?v8",
            "no_mobile_phones": "unicode/1f4f5.png?v8",
            "no_mouth": "unicode/1f636.png?v8",
            "no_pedestrians": "unicode/1f6b7.png?v8",
            "no_smoking": "unicode/1f6ad.png?v8",
            "non-potable_water": "unicode/1f6b1.png?v8",
            "norfolk_island": "unicode/1f1f3-1f1eb.png?v8",
            "north_korea": "unicode/1f1f0-1f1f5.png?v8",
            "northern_mariana_islands": "unicode/1f1f2-1f1f5.png?v8",
            "norway": "unicode/1f1f3-1f1f4.png?v8",
            "nose": "unicode/1f443.png?v8",
            "notebook": "unicode/1f4d3.png?v8",
            "notebook_with_decorative_cover": "unicode/1f4d4.png?v8",
            "notes": "unicode/1f3b6.png?v8",
            "nut_and_bolt": "unicode/1f529.png?v8",
            "o": "unicode/2b55.png?v8",
            "o2": "unicode/1f17e.png?v8",
            "ocean": "unicode/1f30a.png?v8",
            "octocat": "octocat.png?v8",
            "octopus": "unicode/1f419.png?v8",
            "oden": "unicode/1f362.png?v8",
            "office": "unicode/1f3e2.png?v8",
            "office_worker": "unicode/1f9d1-1f4bc.png?v8",
            "oil_drum": "unicode/1f6e2.png?v8",
            "ok": "unicode/1f197.png?v8",
            "ok_hand": "unicode/1f44c.png?v8",
            "ok_man": "unicode/1f646-2642.png?v8",
            "ok_person": "unicode/1f646.png?v8",
            "ok_woman": "unicode/1f646-2640.png?v8",
            "old_key": "unicode/1f5dd.png?v8",
            "older_adult": "unicode/1f9d3.png?v8",
            "older_man": "unicode/1f474.png?v8",
            "older_woman": "unicode/1f475.png?v8",
            "olive": "unicode/1fad2.png?v8",
            "om": "unicode/1f549.png?v8",
            "oman": "unicode/1f1f4-1f1f2.png?v8",
            "on": "unicode/1f51b.png?v8",
            "oncoming_automobile": "unicode/1f698.png?v8",
            "oncoming_bus": "unicode/1f68d.png?v8",
            "oncoming_police_car": "unicode/1f694.png?v8",
            "oncoming_taxi": "unicode/1f696.png?v8",
            "one": "unicode/0031-20e3.png?v8",
            "one_piece_swimsuit": "unicode/1fa71.png?v8",
            "onion": "unicode/1f9c5.png?v8",
            "open_book": "unicode/1f4d6.png?v8",
            "open_file_folder": "unicode/1f4c2.png?v8",
            "open_hands": "unicode/1f450.png?v8",
            "open_mouth": "unicode/1f62e.png?v8",
            "open_umbrella": "unicode/2602.png?v8",
            "ophiuchus": "unicode/26ce.png?v8",
            "orange": "unicode/1f34a.png?v8",
            "orange_book": "unicode/1f4d9.png?v8",
            "orange_circle": "unicode/1f7e0.png?v8",
            "orange_heart": "unicode/1f9e1.png?v8",
            "orange_square": "unicode/1f7e7.png?v8",
            "orangutan": "unicode/1f9a7.png?v8",
            "orthodox_cross": "unicode/2626.png?v8",
            "otter": "unicode/1f9a6.png?v8",
            "outbox_tray": "unicode/1f4e4.png?v8",
            "owl": "unicode/1f989.png?v8",
            "ox": "unicode/1f402.png?v8",
            "oyster": "unicode/1f9aa.png?v8",
            "package": "unicode/1f4e6.png?v8",
            "page_facing_up": "unicode/1f4c4.png?v8",
            "page_with_curl": "unicode/1f4c3.png?v8",
            "pager": "unicode/1f4df.png?v8",
            "paintbrush": "unicode/1f58c.png?v8",
            "pakistan": "unicode/1f1f5-1f1f0.png?v8",
            "palau": "unicode/1f1f5-1f1fc.png?v8",
            "palestinian_territories": "unicode/1f1f5-1f1f8.png?v8",
            "palm_tree": "unicode/1f334.png?v8",
            "palms_up_together": "unicode/1f932.png?v8",
            "panama": "unicode/1f1f5-1f1e6.png?v8",
            "pancakes": "unicode/1f95e.png?v8",
            "panda_face": "unicode/1f43c.png?v8",
            "paperclip": "unicode/1f4ce.png?v8",
            "paperclips": "unicode/1f587.png?v8",
            "papua_new_guinea": "unicode/1f1f5-1f1ec.png?v8",
            "parachute": "unicode/1fa82.png?v8",
            "paraguay": "unicode/1f1f5-1f1fe.png?v8",
            "parasol_on_ground": "unicode/26f1.png?v8",
            "parking": "unicode/1f17f.png?v8",
            "parrot": "unicode/1f99c.png?v8",
            "part_alternation_mark": "unicode/303d.png?v8",
            "partly_sunny": "unicode/26c5.png?v8",
            "partying_face": "unicode/1f973.png?v8",
            "passenger_ship": "unicode/1f6f3.png?v8",
            "passport_control": "unicode/1f6c2.png?v8",
            "pause_button": "unicode/23f8.png?v8",
            "paw_prints": "unicode/1f43e.png?v8",
            "peace_symbol": "unicode/262e.png?v8",
            "peach": "unicode/1f351.png?v8",
            "peacock": "unicode/1f99a.png?v8",
            "peanuts": "unicode/1f95c.png?v8",
            "pear": "unicode/1f350.png?v8",
            "pen": "unicode/1f58a.png?v8",
            "pencil": "unicode/1f4dd.png?v8",
            "pencil2": "unicode/270f.png?v8",
            "penguin": "unicode/1f427.png?v8",
            "pensive": "unicode/1f614.png?v8",
            "people_holding_hands": "unicode/1f9d1-1f91d-1f9d1.png?v8",
            "people_hugging": "unicode/1fac2.png?v8",
            "performing_arts": "unicode/1f3ad.png?v8",
            "persevere": "unicode/1f623.png?v8",
            "person_bald": "unicode/1f9d1-1f9b2.png?v8",
            "person_curly_hair": "unicode/1f9d1-1f9b1.png?v8",
            "person_feeding_baby": "unicode/1f9d1-1f37c.png?v8",
            "person_fencing": "unicode/1f93a.png?v8",
            "person_in_manual_wheelchair": "unicode/1f9d1-1f9bd.png?v8",
            "person_in_motorized_wheelchair": "unicode/1f9d1-1f9bc.png?v8",
            "person_in_tuxedo": "unicode/1f935.png?v8",
            "person_red_hair": "unicode/1f9d1-1f9b0.png?v8",
            "person_white_hair": "unicode/1f9d1-1f9b3.png?v8",
            "person_with_probing_cane": "unicode/1f9d1-1f9af.png?v8",
            "person_with_turban": "unicode/1f473.png?v8",
            "person_with_veil": "unicode/1f470.png?v8",
            "peru": "unicode/1f1f5-1f1ea.png?v8",
            "petri_dish": "unicode/1f9eb.png?v8",
            "philippines": "unicode/1f1f5-1f1ed.png?v8",
            "phone": "unicode/260e.png?v8",
            "pick": "unicode/26cf.png?v8",
            "pickup_truck": "unicode/1f6fb.png?v8",
            "pie": "unicode/1f967.png?v8",
            "pig": "unicode/1f437.png?v8",
            "pig2": "unicode/1f416.png?v8",
            "pig_nose": "unicode/1f43d.png?v8",
            "pill": "unicode/1f48a.png?v8",
            "pilot": "unicode/1f9d1-2708.png?v8",
            "pinata": "unicode/1fa85.png?v8",
            "pinched_fingers": "unicode/1f90c.png?v8",
            "pinching_hand": "unicode/1f90f.png?v8",
            "pineapple": "unicode/1f34d.png?v8",
            "ping_pong": "unicode/1f3d3.png?v8",
            "pirate_flag": "unicode/1f3f4-2620.png?v8",
            "pisces": "unicode/2653.png?v8",
            "pitcairn_islands": "unicode/1f1f5-1f1f3.png?v8",
            "pizza": "unicode/1f355.png?v8",
            "placard": "unicode/1faa7.png?v8",
            "place_of_worship": "unicode/1f6d0.png?v8",
            "plate_with_cutlery": "unicode/1f37d.png?v8",
            "play_or_pause_button": "unicode/23ef.png?v8",
            "pleading_face": "unicode/1f97a.png?v8",
            "plunger": "unicode/1faa0.png?v8",
            "point_down": "unicode/1f447.png?v8",
            "point_left": "unicode/1f448.png?v8",
            "point_right": "unicode/1f449.png?v8",
            "point_up": "unicode/261d.png?v8",
            "point_up_2": "unicode/1f446.png?v8",
            "poland": "unicode/1f1f5-1f1f1.png?v8",
            "polar_bear": "unicode/1f43b-2744.png?v8",
            "police_car": "unicode/1f693.png?v8",
            "police_officer": "unicode/1f46e.png?v8",
            "policeman": "unicode/1f46e-2642.png?v8",
            "policewoman": "unicode/1f46e-2640.png?v8",
            "poodle": "unicode/1f429.png?v8",
            "poop": "unicode/1f4a9.png?v8",
            "popcorn": "unicode/1f37f.png?v8",
            "portugal": "unicode/1f1f5-1f1f9.png?v8",
            "post_office": "unicode/1f3e3.png?v8",
            "postal_horn": "unicode/1f4ef.png?v8",
            "postbox": "unicode/1f4ee.png?v8",
            "potable_water": "unicode/1f6b0.png?v8",
            "potato": "unicode/1f954.png?v8",
            "potted_plant": "unicode/1fab4.png?v8",
            "pouch": "unicode/1f45d.png?v8",
            "poultry_leg": "unicode/1f357.png?v8",
            "pound": "unicode/1f4b7.png?v8",
            "pout": "unicode/1f621.png?v8",
            "pouting_cat": "unicode/1f63e.png?v8",
            "pouting_face": "unicode/1f64e.png?v8",
            "pouting_man": "unicode/1f64e-2642.png?v8",
            "pouting_woman": "unicode/1f64e-2640.png?v8",
            "pray": "unicode/1f64f.png?v8",
            "prayer_beads": "unicode/1f4ff.png?v8",
            "pregnant_woman": "unicode/1f930.png?v8",
            "pretzel": "unicode/1f968.png?v8",
            "previous_track_button": "unicode/23ee.png?v8",
            "prince": "unicode/1f934.png?v8",
            "princess": "unicode/1f478.png?v8",
            "printer": "unicode/1f5a8.png?v8",
            "probing_cane": "unicode/1f9af.png?v8",
            "puerto_rico": "unicode/1f1f5-1f1f7.png?v8",
            "punch": "unicode/1f44a.png?v8",
            "purple_circle": "unicode/1f7e3.png?v8",
            "purple_heart": "unicode/1f49c.png?v8",
            "purple_square": "unicode/1f7ea.png?v8",
            "purse": "unicode/1f45b.png?v8",
            "pushpin": "unicode/1f4cc.png?v8",
            "put_litter_in_its_place": "unicode/1f6ae.png?v8",
            "qatar": "unicode/1f1f6-1f1e6.png?v8",
            "question": "unicode/2753.png?v8",
            "rabbit": "unicode/1f430.png?v8",
            "rabbit2": "unicode/1f407.png?v8",
            "raccoon": "unicode/1f99d.png?v8",
            "racehorse": "unicode/1f40e.png?v8",
            "racing_car": "unicode/1f3ce.png?v8",
            "radio": "unicode/1f4fb.png?v8",
            "radio_button": "unicode/1f518.png?v8",
            "radioactive": "unicode/2622.png?v8",
            "rage": "unicode/1f621.png?v8",
            "rage1": "rage1.png?v8",
            "rage2": "rage2.png?v8",
            "rage3": "rage3.png?v8",
            "rage4": "rage4.png?v8",
            "railway_car": "unicode/1f683.png?v8",
            "railway_track": "unicode/1f6e4.png?v8",
            "rainbow": "unicode/1f308.png?v8",
            "rainbow_flag": "unicode/1f3f3-1f308.png?v8",
            "raised_back_of_hand": "unicode/1f91a.png?v8",
            "raised_eyebrow": "unicode/1f928.png?v8",
            "raised_hand": "unicode/270b.png?v8",
            "raised_hand_with_fingers_splayed": "unicode/1f590.png?v8",
            "raised_hands": "unicode/1f64c.png?v8",
            "raising_hand": "unicode/1f64b.png?v8",
            "raising_hand_man": "unicode/1f64b-2642.png?v8",
            "raising_hand_woman": "unicode/1f64b-2640.png?v8",
            "ram": "unicode/1f40f.png?v8",
            "ramen": "unicode/1f35c.png?v8",
            "rat": "unicode/1f400.png?v8",
            "razor": "unicode/1fa92.png?v8",
            "receipt": "unicode/1f9fe.png?v8",
            "record_button": "unicode/23fa.png?v8",
            "recycle": "unicode/267b.png?v8",
            "red_car": "unicode/1f697.png?v8",
            "red_circle": "unicode/1f534.png?v8",
            "red_envelope": "unicode/1f9e7.png?v8",
            "red_haired_man": "unicode/1f468-1f9b0.png?v8",
            "red_haired_woman": "unicode/1f469-1f9b0.png?v8",
            "red_square": "unicode/1f7e5.png?v8",
            "registered": "unicode/00ae.png?v8",
            "relaxed": "unicode/263a.png?v8",
            "relieved": "unicode/1f60c.png?v8",
            "reminder_ribbon": "unicode/1f397.png?v8",
            "repeat": "unicode/1f501.png?v8",
            "repeat_one": "unicode/1f502.png?v8",
            "rescue_worker_helmet": "unicode/26d1.png?v8",
            "restroom": "unicode/1f6bb.png?v8",
            "reunion": "unicode/1f1f7-1f1ea.png?v8",
            "revolving_hearts": "unicode/1f49e.png?v8",
            "rewind": "unicode/23ea.png?v8",
            "rhinoceros": "unicode/1f98f.png?v8",
            "ribbon": "unicode/1f380.png?v8",
            "rice": "unicode/1f35a.png?v8",
            "rice_ball": "unicode/1f359.png?v8",
            "rice_cracker": "unicode/1f358.png?v8",
            "rice_scene": "unicode/1f391.png?v8",
            "right_anger_bubble": "unicode/1f5ef.png?v8",
            "ring": "unicode/1f48d.png?v8",
            "ringed_planet": "unicode/1fa90.png?v8",
            "robot": "unicode/1f916.png?v8",
            "rock": "unicode/1faa8.png?v8",
            "rocket": "unicode/1f680.png?v8",
            "rofl": "unicode/1f923.png?v8",
            "roll_eyes": "unicode/1f644.png?v8",
            "roll_of_paper": "unicode/1f9fb.png?v8",
            "roller_coaster": "unicode/1f3a2.png?v8",
            "roller_skate": "unicode/1f6fc.png?v8",
            "romania": "unicode/1f1f7-1f1f4.png?v8",
            "rooster": "unicode/1f413.png?v8",
            "rose": "unicode/1f339.png?v8",
            "rosette": "unicode/1f3f5.png?v8",
            "rotating_light": "unicode/1f6a8.png?v8",
            "round_pushpin": "unicode/1f4cd.png?v8",
            "rowboat": "unicode/1f6a3.png?v8",
            "rowing_man": "unicode/1f6a3-2642.png?v8",
            "rowing_woman": "unicode/1f6a3-2640.png?v8",
            "ru": "unicode/1f1f7-1f1fa.png?v8",
            "rugby_football": "unicode/1f3c9.png?v8",
            "runner": "unicode/1f3c3.png?v8",
            "running": "unicode/1f3c3.png?v8",
            "running_man": "unicode/1f3c3-2642.png?v8",
            "running_shirt_with_sash": "unicode/1f3bd.png?v8",
            "running_woman": "unicode/1f3c3-2640.png?v8",
            "rwanda": "unicode/1f1f7-1f1fc.png?v8",
            "sa": "unicode/1f202.png?v8",
            "safety_pin": "unicode/1f9f7.png?v8",
            "safety_vest": "unicode/1f9ba.png?v8",
            "sagittarius": "unicode/2650.png?v8",
            "sailboat": "unicode/26f5.png?v8",
            "sake": "unicode/1f376.png?v8",
            "salt": "unicode/1f9c2.png?v8",
            "samoa": "unicode/1f1fc-1f1f8.png?v8",
            "san_marino": "unicode/1f1f8-1f1f2.png?v8",
            "sandal": "unicode/1f461.png?v8",
            "sandwich": "unicode/1f96a.png?v8",
            "santa": "unicode/1f385.png?v8",
            "sao_tome_principe": "unicode/1f1f8-1f1f9.png?v8",
            "sari": "unicode/1f97b.png?v8",
            "sassy_man": "unicode/1f481-2642.png?v8",
            "sassy_woman": "unicode/1f481-2640.png?v8",
            "satellite": "unicode/1f4e1.png?v8",
            "satisfied": "unicode/1f606.png?v8",
            "saudi_arabia": "unicode/1f1f8-1f1e6.png?v8",
            "sauna_man": "unicode/1f9d6-2642.png?v8",
            "sauna_person": "unicode/1f9d6.png?v8",
            "sauna_woman": "unicode/1f9d6-2640.png?v8",
            "sauropod": "unicode/1f995.png?v8",
            "saxophone": "unicode/1f3b7.png?v8",
            "scarf": "unicode/1f9e3.png?v8",
            "school": "unicode/1f3eb.png?v8",
            "school_satchel": "unicode/1f392.png?v8",
            "scientist": "unicode/1f9d1-1f52c.png?v8",
            "scissors": "unicode/2702.png?v8",
            "scorpion": "unicode/1f982.png?v8",
            "scorpius": "unicode/264f.png?v8",
            "scotland": "unicode/1f3f4-e0067-e0062-e0073-e0063-e0074-e007f.png?v8",
            "scream": "unicode/1f631.png?v8",
            "scream_cat": "unicode/1f640.png?v8",
            "screwdriver": "unicode/1fa9b.png?v8",
            "scroll": "unicode/1f4dc.png?v8",
            "seal": "unicode/1f9ad.png?v8",
            "seat": "unicode/1f4ba.png?v8",
            "secret": "unicode/3299.png?v8",
            "see_no_evil": "unicode/1f648.png?v8",
            "seedling": "unicode/1f331.png?v8",
            "selfie": "unicode/1f933.png?v8",
            "senegal": "unicode/1f1f8-1f1f3.png?v8",
            "serbia": "unicode/1f1f7-1f1f8.png?v8",
            "service_dog": "unicode/1f415-1f9ba.png?v8",
            "seven": "unicode/0037-20e3.png?v8",
            "sewing_needle": "unicode/1faa1.png?v8",
            "seychelles": "unicode/1f1f8-1f1e8.png?v8",
            "shallow_pan_of_food": "unicode/1f958.png?v8",
            "shamrock": "unicode/2618.png?v8",
            "shark": "unicode/1f988.png?v8",
            "shaved_ice": "unicode/1f367.png?v8",
            "sheep": "unicode/1f411.png?v8",
            "shell": "unicode/1f41a.png?v8",
            "shield": "unicode/1f6e1.png?v8",
            "shinto_shrine": "unicode/26e9.png?v8",
            "ship": "unicode/1f6a2.png?v8",
            "shipit": "shipit.png?v8",
            "shirt": "unicode/1f455.png?v8",
            "shit": "unicode/1f4a9.png?v8",
            "shoe": "unicode/1f45e.png?v8",
            "shopping": "unicode/1f6cd.png?v8",
            "shopping_cart": "unicode/1f6d2.png?v8",
            "shorts": "unicode/1fa73.png?v8",
            "shower": "unicode/1f6bf.png?v8",
            "shrimp": "unicode/1f990.png?v8",
            "shrug": "unicode/1f937.png?v8",
            "shushing_face": "unicode/1f92b.png?v8",
            "sierra_leone": "unicode/1f1f8-1f1f1.png?v8",
            "signal_strength": "unicode/1f4f6.png?v8",
            "singapore": "unicode/1f1f8-1f1ec.png?v8",
            "singer": "unicode/1f9d1-1f3a4.png?v8",
            "sint_maarten": "unicode/1f1f8-1f1fd.png?v8",
            "six": "unicode/0036-20e3.png?v8",
            "six_pointed_star": "unicode/1f52f.png?v8",
            "skateboard": "unicode/1f6f9.png?v8",
            "ski": "unicode/1f3bf.png?v8",
            "skier": "unicode/26f7.png?v8",
            "skull": "unicode/1f480.png?v8",
            "skull_and_crossbones": "unicode/2620.png?v8",
            "skunk": "unicode/1f9a8.png?v8",
            "sled": "unicode/1f6f7.png?v8",
            "sleeping": "unicode/1f634.png?v8",
            "sleeping_bed": "unicode/1f6cc.png?v8",
            "sleepy": "unicode/1f62a.png?v8",
            "slightly_frowning_face": "unicode/1f641.png?v8",
            "slightly_smiling_face": "unicode/1f642.png?v8",
            "slot_machine": "unicode/1f3b0.png?v8",
            "sloth": "unicode/1f9a5.png?v8",
            "slovakia": "unicode/1f1f8-1f1f0.png?v8",
            "slovenia": "unicode/1f1f8-1f1ee.png?v8",
            "small_airplane": "unicode/1f6e9.png?v8",
            "small_blue_diamond": "unicode/1f539.png?v8",
            "small_orange_diamond": "unicode/1f538.png?v8",
            "small_red_triangle": "unicode/1f53a.png?v8",
            "small_red_triangle_down": "unicode/1f53b.png?v8",
            "smile": "unicode/1f604.png?v8",
            "smile_cat": "unicode/1f638.png?v8",
            "smiley": "unicode/1f603.png?v8",
            "smiley_cat": "unicode/1f63a.png?v8",
            "smiling_face_with_tear": "unicode/1f972.png?v8",
            "smiling_face_with_three_hearts": "unicode/1f970.png?v8",
            "smiling_imp": "unicode/1f608.png?v8",
            "smirk": "unicode/1f60f.png?v8",
            "smirk_cat": "unicode/1f63c.png?v8",
            "smoking": "unicode/1f6ac.png?v8",
            "snail": "unicode/1f40c.png?v8",
            "snake": "unicode/1f40d.png?v8",
            "sneezing_face": "unicode/1f927.png?v8",
            "snowboarder": "unicode/1f3c2.png?v8",
            "snowflake": "unicode/2744.png?v8",
            "snowman": "unicode/26c4.png?v8",
            "snowman_with_snow": "unicode/2603.png?v8",
            "soap": "unicode/1f9fc.png?v8",
            "sob": "unicode/1f62d.png?v8",
            "soccer": "unicode/26bd.png?v8",
            "socks": "unicode/1f9e6.png?v8",
            "softball": "unicode/1f94e.png?v8",
            "solomon_islands": "unicode/1f1f8-1f1e7.png?v8",
            "somalia": "unicode/1f1f8-1f1f4.png?v8",
            "soon": "unicode/1f51c.png?v8",
            "sos": "unicode/1f198.png?v8",
            "sound": "unicode/1f509.png?v8",
            "south_africa": "unicode/1f1ff-1f1e6.png?v8",
            "south_georgia_south_sandwich_islands": "unicode/1f1ec-1f1f8.png?v8",
            "south_sudan": "unicode/1f1f8-1f1f8.png?v8",
            "space_invader": "unicode/1f47e.png?v8",
            "spades": "unicode/2660.png?v8",
            "spaghetti": "unicode/1f35d.png?v8",
            "sparkle": "unicode/2747.png?v8",
            "sparkler": "unicode/1f387.png?v8",
            "sparkles": "unicode/2728.png?v8",
            "sparkling_heart": "unicode/1f496.png?v8",
            "speak_no_evil": "unicode/1f64a.png?v8",
            "speaker": "unicode/1f508.png?v8",
            "speaking_head": "unicode/1f5e3.png?v8",
            "speech_balloon": "unicode/1f4ac.png?v8",
            "speedboat": "unicode/1f6a4.png?v8",
            "spider": "unicode/1f577.png?v8",
            "spider_web": "unicode/1f578.png?v8",
            "spiral_calendar": "unicode/1f5d3.png?v8",
            "spiral_notepad": "unicode/1f5d2.png?v8",
            "sponge": "unicode/1f9fd.png?v8",
            "spoon": "unicode/1f944.png?v8",
            "squid": "unicode/1f991.png?v8",
            "sri_lanka": "unicode/1f1f1-1f1f0.png?v8",
            "st_barthelemy": "unicode/1f1e7-1f1f1.png?v8",
            "st_helena": "unicode/1f1f8-1f1ed.png?v8",
            "st_kitts_nevis": "unicode/1f1f0-1f1f3.png?v8",
            "st_lucia": "unicode/1f1f1-1f1e8.png?v8",
            "st_martin": "unicode/1f1f2-1f1eb.png?v8",
            "st_pierre_miquelon": "unicode/1f1f5-1f1f2.png?v8",
            "st_vincent_grenadines": "unicode/1f1fb-1f1e8.png?v8",
            "stadium": "unicode/1f3df.png?v8",
            "standing_man": "unicode/1f9cd-2642.png?v8",
            "standing_person": "unicode/1f9cd.png?v8",
            "standing_woman": "unicode/1f9cd-2640.png?v8",
            "star": "unicode/2b50.png?v8",
            "star2": "unicode/1f31f.png?v8",
            "star_and_crescent": "unicode/262a.png?v8",
            "star_of_david": "unicode/2721.png?v8",
            "star_struck": "unicode/1f929.png?v8",
            "stars": "unicode/1f320.png?v8",
            "station": "unicode/1f689.png?v8",
            "statue_of_liberty": "unicode/1f5fd.png?v8",
            "steam_locomotive": "unicode/1f682.png?v8",
            "stethoscope": "unicode/1fa7a.png?v8",
            "stew": "unicode/1f372.png?v8",
            "stop_button": "unicode/23f9.png?v8",
            "stop_sign": "unicode/1f6d1.png?v8",
            "stopwatch": "unicode/23f1.png?v8",
            "straight_ruler": "unicode/1f4cf.png?v8",
            "strawberry": "unicode/1f353.png?v8",
            "stuck_out_tongue": "unicode/1f61b.png?v8",
            "stuck_out_tongue_closed_eyes": "unicode/1f61d.png?v8",
            "stuck_out_tongue_winking_eye": "unicode/1f61c.png?v8",
            "student": "unicode/1f9d1-1f393.png?v8",
            "studio_microphone": "unicode/1f399.png?v8",
            "stuffed_flatbread": "unicode/1f959.png?v8",
            "sudan": "unicode/1f1f8-1f1e9.png?v8",
            "sun_behind_large_cloud": "unicode/1f325.png?v8",
            "sun_behind_rain_cloud": "unicode/1f326.png?v8",
            "sun_behind_small_cloud": "unicode/1f324.png?v8",
            "sun_with_face": "unicode/1f31e.png?v8",
            "sunflower": "unicode/1f33b.png?v8",
            "sunglasses": "unicode/1f60e.png?v8",
            "sunny": "unicode/2600.png?v8",
            "sunrise": "unicode/1f305.png?v8",
            "sunrise_over_mountains": "unicode/1f304.png?v8",
            "superhero": "unicode/1f9b8.png?v8",
            "superhero_man": "unicode/1f9b8-2642.png?v8",
            "superhero_woman": "unicode/1f9b8-2640.png?v8",
            "supervillain": "unicode/1f9b9.png?v8",
            "supervillain_man": "unicode/1f9b9-2642.png?v8",
            "supervillain_woman": "unicode/1f9b9-2640.png?v8",
            "surfer": "unicode/1f3c4.png?v8",
            "surfing_man": "unicode/1f3c4-2642.png?v8",
            "surfing_woman": "unicode/1f3c4-2640.png?v8",
            "suriname": "unicode/1f1f8-1f1f7.png?v8",
            "sushi": "unicode/1f363.png?v8",
            "suspect": "suspect.png?v8",
            "suspension_railway": "unicode/1f69f.png?v8",
            "svalbard_jan_mayen": "unicode/1f1f8-1f1ef.png?v8",
            "swan": "unicode/1f9a2.png?v8",
            "swaziland": "unicode/1f1f8-1f1ff.png?v8",
            "sweat": "unicode/1f613.png?v8",
            "sweat_drops": "unicode/1f4a6.png?v8",
            "sweat_smile": "unicode/1f605.png?v8",
            "sweden": "unicode/1f1f8-1f1ea.png?v8",
            "sweet_potato": "unicode/1f360.png?v8",
            "swim_brief": "unicode/1fa72.png?v8",
            "swimmer": "unicode/1f3ca.png?v8",
            "swimming_man": "unicode/1f3ca-2642.png?v8",
            "swimming_woman": "unicode/1f3ca-2640.png?v8",
            "switzerland": "unicode/1f1e8-1f1ed.png?v8",
            "symbols": "unicode/1f523.png?v8",
            "synagogue": "unicode/1f54d.png?v8",
            "syria": "unicode/1f1f8-1f1fe.png?v8",
            "syringe": "unicode/1f489.png?v8",
            "t-rex": "unicode/1f996.png?v8",
            "taco": "unicode/1f32e.png?v8",
            "tada": "unicode/1f389.png?v8",
            "taiwan": "unicode/1f1f9-1f1fc.png?v8",
            "tajikistan": "unicode/1f1f9-1f1ef.png?v8",
            "takeout_box": "unicode/1f961.png?v8",
            "tamale": "unicode/1fad4.png?v8",
            "tanabata_tree": "unicode/1f38b.png?v8",
            "tangerine": "unicode/1f34a.png?v8",
            "tanzania": "unicode/1f1f9-1f1ff.png?v8",
            "taurus": "unicode/2649.png?v8",
            "taxi": "unicode/1f695.png?v8",
            "tea": "unicode/1f375.png?v8",
            "teacher": "unicode/1f9d1-1f3eb.png?v8",
            "teapot": "unicode/1fad6.png?v8",
            "technologist": "unicode/1f9d1-1f4bb.png?v8",
            "teddy_bear": "unicode/1f9f8.png?v8",
            "telephone": "unicode/260e.png?v8",
            "telephone_receiver": "unicode/1f4de.png?v8",
            "telescope": "unicode/1f52d.png?v8",
            "tennis": "unicode/1f3be.png?v8",
            "tent": "unicode/26fa.png?v8",
            "test_tube": "unicode/1f9ea.png?v8",
            "thailand": "unicode/1f1f9-1f1ed.png?v8",
            "thermometer": "unicode/1f321.png?v8",
            "thinking": "unicode/1f914.png?v8",
            "thong_sandal": "unicode/1fa74.png?v8",
            "thought_balloon": "unicode/1f4ad.png?v8",
            "thread": "unicode/1f9f5.png?v8",
            "three": "unicode/0033-20e3.png?v8",
            "thumbsdown": "unicode/1f44e.png?v8",
            "thumbsup": "unicode/1f44d.png?v8",
            "ticket": "unicode/1f3ab.png?v8",
            "tickets": "unicode/1f39f.png?v8",
            "tiger": "unicode/1f42f.png?v8",
            "tiger2": "unicode/1f405.png?v8",
            "timer_clock": "unicode/23f2.png?v8",
            "timor_leste": "unicode/1f1f9-1f1f1.png?v8",
            "tipping_hand_man": "unicode/1f481-2642.png?v8",
            "tipping_hand_person": "unicode/1f481.png?v8",
            "tipping_hand_woman": "unicode/1f481-2640.png?v8",
            "tired_face": "unicode/1f62b.png?v8",
            "tm": "unicode/2122.png?v8",
            "togo": "unicode/1f1f9-1f1ec.png?v8",
            "toilet": "unicode/1f6bd.png?v8",
            "tokelau": "unicode/1f1f9-1f1f0.png?v8",
            "tokyo_tower": "unicode/1f5fc.png?v8",
            "tomato": "unicode/1f345.png?v8",
            "tonga": "unicode/1f1f9-1f1f4.png?v8",
            "tongue": "unicode/1f445.png?v8",
            "toolbox": "unicode/1f9f0.png?v8",
            "tooth": "unicode/1f9b7.png?v8",
            "toothbrush": "unicode/1faa5.png?v8",
            "top": "unicode/1f51d.png?v8",
            "tophat": "unicode/1f3a9.png?v8",
            "tornado": "unicode/1f32a.png?v8",
            "tr": "unicode/1f1f9-1f1f7.png?v8",
            "trackball": "unicode/1f5b2.png?v8",
            "tractor": "unicode/1f69c.png?v8",
            "traffic_light": "unicode/1f6a5.png?v8",
            "train": "unicode/1f68b.png?v8",
            "train2": "unicode/1f686.png?v8",
            "tram": "unicode/1f68a.png?v8",
            "transgender_flag": "unicode/1f3f3-26a7.png?v8",
            "transgender_symbol": "unicode/26a7.png?v8",
            "triangular_flag_on_post": "unicode/1f6a9.png?v8",
            "triangular_ruler": "unicode/1f4d0.png?v8",
            "trident": "unicode/1f531.png?v8",
            "trinidad_tobago": "unicode/1f1f9-1f1f9.png?v8",
            "tristan_da_cunha": "unicode/1f1f9-1f1e6.png?v8",
            "triumph": "unicode/1f624.png?v8",
            "trolleybus": "unicode/1f68e.png?v8",
            "trollface": "trollface.png?v8",
            "trophy": "unicode/1f3c6.png?v8",
            "tropical_drink": "unicode/1f379.png?v8",
            "tropical_fish": "unicode/1f420.png?v8",
            "truck": "unicode/1f69a.png?v8",
            "trumpet": "unicode/1f3ba.png?v8",
            "tshirt": "unicode/1f455.png?v8",
            "tulip": "unicode/1f337.png?v8",
            "tumbler_glass": "unicode/1f943.png?v8",
            "tunisia": "unicode/1f1f9-1f1f3.png?v8",
            "turkey": "unicode/1f983.png?v8",
            "turkmenistan": "unicode/1f1f9-1f1f2.png?v8",
            "turks_caicos_islands": "unicode/1f1f9-1f1e8.png?v8",
            "turtle": "unicode/1f422.png?v8",
            "tuvalu": "unicode/1f1f9-1f1fb.png?v8",
            "tv": "unicode/1f4fa.png?v8",
            "twisted_rightwards_arrows": "unicode/1f500.png?v8",
            "two": "unicode/0032-20e3.png?v8",
            "two_hearts": "unicode/1f495.png?v8",
            "two_men_holding_hands": "unicode/1f46c.png?v8",
            "two_women_holding_hands": "unicode/1f46d.png?v8",
            "u5272": "unicode/1f239.png?v8",
            "u5408": "unicode/1f234.png?v8",
            "u55b6": "unicode/1f23a.png?v8",
            "u6307": "unicode/1f22f.png?v8",
            "u6708": "unicode/1f237.png?v8",
            "u6709": "unicode/1f236.png?v8",
            "u6e80": "unicode/1f235.png?v8",
            "u7121": "unicode/1f21a.png?v8",
            "u7533": "unicode/1f238.png?v8",
            "u7981": "unicode/1f232.png?v8",
            "u7a7a": "unicode/1f233.png?v8",
            "uganda": "unicode/1f1fa-1f1ec.png?v8",
            "uk": "unicode/1f1ec-1f1e7.png?v8",
            "ukraine": "unicode/1f1fa-1f1e6.png?v8",
            "umbrella": "unicode/2614.png?v8",
            "unamused": "unicode/1f612.png?v8",
            "underage": "unicode/1f51e.png?v8",
            "unicorn": "unicode/1f984.png?v8",
            "united_arab_emirates": "unicode/1f1e6-1f1ea.png?v8",
            "united_nations": "unicode/1f1fa-1f1f3.png?v8",
            "unlock": "unicode/1f513.png?v8",
            "up": "unicode/1f199.png?v8",
            "upside_down_face": "unicode/1f643.png?v8",
            "uruguay": "unicode/1f1fa-1f1fe.png?v8",
            "us": "unicode/1f1fa-1f1f8.png?v8",
            "us_outlying_islands": "unicode/1f1fa-1f1f2.png?v8",
            "us_virgin_islands": "unicode/1f1fb-1f1ee.png?v8",
            "uzbekistan": "unicode/1f1fa-1f1ff.png?v8",
            "v": "unicode/270c.png?v8",
            "vampire": "unicode/1f9db.png?v8",
            "vampire_man": "unicode/1f9db-2642.png?v8",
            "vampire_woman": "unicode/1f9db-2640.png?v8",
            "vanuatu": "unicode/1f1fb-1f1fa.png?v8",
            "vatican_city": "unicode/1f1fb-1f1e6.png?v8",
            "venezuela": "unicode/1f1fb-1f1ea.png?v8",
            "vertical_traffic_light": "unicode/1f6a6.png?v8",
            "vhs": "unicode/1f4fc.png?v8",
            "vibration_mode": "unicode/1f4f3.png?v8",
            "video_camera": "unicode/1f4f9.png?v8",
            "video_game": "unicode/1f3ae.png?v8",
            "vietnam": "unicode/1f1fb-1f1f3.png?v8",
            "violin": "unicode/1f3bb.png?v8",
            "virgo": "unicode/264d.png?v8",
            "volcano": "unicode/1f30b.png?v8",
            "volleyball": "unicode/1f3d0.png?v8",
            "vomiting_face": "unicode/1f92e.png?v8",
            "vs": "unicode/1f19a.png?v8",
            "vulcan_salute": "unicode/1f596.png?v8",
            "waffle": "unicode/1f9c7.png?v8",
            "wales": "unicode/1f3f4-e0067-e0062-e0077-e006c-e0073-e007f.png?v8",
            "walking": "unicode/1f6b6.png?v8",
            "walking_man": "unicode/1f6b6-2642.png?v8",
            "walking_woman": "unicode/1f6b6-2640.png?v8",
            "wallis_futuna": "unicode/1f1fc-1f1eb.png?v8",
            "waning_crescent_moon": "unicode/1f318.png?v8",
            "waning_gibbous_moon": "unicode/1f316.png?v8",
            "warning": "unicode/26a0.png?v8",
            "wastebasket": "unicode/1f5d1.png?v8",
            "watch": "unicode/231a.png?v8",
            "water_buffalo": "unicode/1f403.png?v8",
            "water_polo": "unicode/1f93d.png?v8",
            "watermelon": "unicode/1f349.png?v8",
            "wave": "unicode/1f44b.png?v8",
            "wavy_dash": "unicode/3030.png?v8",
            "waxing_crescent_moon": "unicode/1f312.png?v8",
            "waxing_gibbous_moon": "unicode/1f314.png?v8",
            "wc": "unicode/1f6be.png?v8",
            "weary": "unicode/1f629.png?v8",
            "wedding": "unicode/1f492.png?v8",
            "weight_lifting": "unicode/1f3cb.png?v8",
            "weight_lifting_man": "unicode/1f3cb-2642.png?v8",
            "weight_lifting_woman": "unicode/1f3cb-2640.png?v8",
            "western_sahara": "unicode/1f1ea-1f1ed.png?v8",
            "whale": "unicode/1f433.png?v8",
            "whale2": "unicode/1f40b.png?v8",
            "wheel_of_dharma": "unicode/2638.png?v8",
            "wheelchair": "unicode/267f.png?v8",
            "white_check_mark": "unicode/2705.png?v8",
            "white_circle": "unicode/26aa.png?v8",
            "white_flag": "unicode/1f3f3.png?v8",
            "white_flower": "unicode/1f4ae.png?v8",
            "white_haired_man": "unicode/1f468-1f9b3.png?v8",
            "white_haired_woman": "unicode/1f469-1f9b3.png?v8",
            "white_heart": "unicode/1f90d.png?v8",
            "white_large_square": "unicode/2b1c.png?v8",
            "white_medium_small_square": "unicode/25fd.png?v8",
            "white_medium_square": "unicode/25fb.png?v8",
            "white_small_square": "unicode/25ab.png?v8",
            "white_square_button": "unicode/1f533.png?v8",
            "wilted_flower": "unicode/1f940.png?v8",
            "wind_chime": "unicode/1f390.png?v8",
            "wind_face": "unicode/1f32c.png?v8",
            "window": "unicode/1fa9f.png?v8",
            "wine_glass": "unicode/1f377.png?v8",
            "wink": "unicode/1f609.png?v8",
            "wolf": "unicode/1f43a.png?v8",
            "woman": "unicode/1f469.png?v8",
            "woman_artist": "unicode/1f469-1f3a8.png?v8",
            "woman_astronaut": "unicode/1f469-1f680.png?v8",
            "woman_beard": "unicode/1f9d4-2640.png?v8",
            "woman_cartwheeling": "unicode/1f938-2640.png?v8",
            "woman_cook": "unicode/1f469-1f373.png?v8",
            "woman_dancing": "unicode/1f483.png?v8",
            "woman_facepalming": "unicode/1f926-2640.png?v8",
            "woman_factory_worker": "unicode/1f469-1f3ed.png?v8",
            "woman_farmer": "unicode/1f469-1f33e.png?v8",
            "woman_feeding_baby": "unicode/1f469-1f37c.png?v8",
            "woman_firefighter": "unicode/1f469-1f692.png?v8",
            "woman_health_worker": "unicode/1f469-2695.png?v8",
            "woman_in_manual_wheelchair": "unicode/1f469-1f9bd.png?v8",
            "woman_in_motorized_wheelchair": "unicode/1f469-1f9bc.png?v8",
            "woman_in_tuxedo": "unicode/1f935-2640.png?v8",
            "woman_judge": "unicode/1f469-2696.png?v8",
            "woman_juggling": "unicode/1f939-2640.png?v8",
            "woman_mechanic": "unicode/1f469-1f527.png?v8",
            "woman_office_worker": "unicode/1f469-1f4bc.png?v8",
            "woman_pilot": "unicode/1f469-2708.png?v8",
            "woman_playing_handball": "unicode/1f93e-2640.png?v8",
            "woman_playing_water_polo": "unicode/1f93d-2640.png?v8",
            "woman_scientist": "unicode/1f469-1f52c.png?v8",
            "woman_shrugging": "unicode/1f937-2640.png?v8",
            "woman_singer": "unicode/1f469-1f3a4.png?v8",
            "woman_student": "unicode/1f469-1f393.png?v8",
            "woman_teacher": "unicode/1f469-1f3eb.png?v8",
            "woman_technologist": "unicode/1f469-1f4bb.png?v8",
            "woman_with_headscarf": "unicode/1f9d5.png?v8",
            "woman_with_probing_cane": "unicode/1f469-1f9af.png?v8",
            "woman_with_turban": "unicode/1f473-2640.png?v8",
            "woman_with_veil": "unicode/1f470-2640.png?v8",
            "womans_clothes": "unicode/1f45a.png?v8",
            "womans_hat": "unicode/1f452.png?v8",
            "women_wrestling": "unicode/1f93c-2640.png?v8",
            "womens": "unicode/1f6ba.png?v8",
            "wood": "unicode/1fab5.png?v8",
            "woozy_face": "unicode/1f974.png?v8",
            "world_map": "unicode/1f5fa.png?v8",
            "worm": "unicode/1fab1.png?v8",
            "worried": "unicode/1f61f.png?v8",
            "wrench": "unicode/1f527.png?v8",
            "wrestling": "unicode/1f93c.png?v8",
            "writing_hand": "unicode/270d.png?v8",
            "x": "unicode/274c.png?v8",
            "yarn": "unicode/1f9f6.png?v8",
            "yawning_face": "unicode/1f971.png?v8",
            "yellow_circle": "unicode/1f7e1.png?v8",
            "yellow_heart": "unicode/1f49b.png?v8",
            "yellow_square": "unicode/1f7e8.png?v8",
            "yemen": "unicode/1f1fe-1f1ea.png?v8",
            "yen": "unicode/1f4b4.png?v8",
            "yin_yang": "unicode/262f.png?v8",
            "yo_yo": "unicode/1fa80.png?v8",
            "yum": "unicode/1f60b.png?v8",
            "zambia": "unicode/1f1ff-1f1f2.png?v8",
            "zany_face": "unicode/1f92a.png?v8",
            "zap": "unicode/26a1.png?v8",
            "zebra": "unicode/1f993.png?v8",
            "zero": "unicode/0030-20e3.png?v8",
            "zimbabwe": "unicode/1f1ff-1f1fc.png?v8",
            "zipper_mouth_face": "unicode/1f910.png?v8",
            "zombie": "unicode/1f9df.png?v8",
            "zombie_man": "unicode/1f9df-2642.png?v8",
            "zombie_woman": "unicode/1f9df-2640.png?v8",
            "zzz": "unicode/1f4a4.png?v8"
        }
    };

    function replaceEmojiShorthand(m, $1, useNativeEmoji) {
        var emojiMatch = emojiData.data[$1];

        var result = m;

        if (emojiMatch) {
            if (useNativeEmoji && /unicode/.test(emojiMatch)) {
                var emojiUnicode = emojiMatch
                    .replace('unicode/', '')
                    .replace(/\.png.*/, '')
                    .split('-')
                    .map(function (u) { return ("&#x" + u + ";"); })
                    // Separate multi-character emoji with zero width joiner sequence (ZWJ)
                    // Hat tip: https://about.gitlab.com/blog/2018/05/30/journey-in-native-unicode-emoji/#emoji-made-up-of-multiple-characters
                    .join('&zwj;')
                    .concat('&#xFE0E;');
                result = "<span class=\"emoji\">" + emojiUnicode + "</span>";
            } else {
                result = "<img src=\"" + (emojiData.baseURL) + emojiMatch + ".png\" alt=\"" + $1 + "\" class=\"emoji\" loading=\"lazy\">";
            }
        }

        return result;
    }

    function emojify(text, useNativeEmoji) {
        return (
            text
                // Mark colons in tags
                .replace(
                    /<(code|pre|script|template)[^>]*?>[\s\S]+?<\/(code|pre|script|template)>/g,
                    function (m) { return m.replace(/:/g, '__colon__'); }
                )
                // Mark colons in comments
                .replace(/<!--[\s\S]+?-->/g, function (m) { return m.replace(/:/g, '__colon__'); })
                // Mark colons in URIs
                .replace(/([a-z]{2,}:)?\/\/[^\s'">)]+/gi, function (m) { return m.replace(/:/g, '__colon__'); }
                )
                // Replace emoji shorthand codes
                .replace(/:([a-z0-9_\-+]+?):/g, function (m, $1) { return replaceEmojiShorthand(m, $1, useNativeEmoji); }
                )
                // Restore colons in tags and comments
                .replace(/__colon__/g, ':')
        );
    }

    /**
     * Converts a colon formatted string to a object with properties.
     *
     * This is process a provided string and look for any tokens in the format
     * of `:name[=value]` and then convert it to a object and return.
     * An example of this is ':include :type=code :fragment=demo' is taken and
     * then converted to:
     *
     * ```
     * {
     *  include: '',
     *  type: 'code',
     *  fragment: 'demo'
     * }
     * ```
     *
     * @param {string}   str   The string to parse.
     *
     * @return {object}  The original string and parsed object, { str, config }.
     */
    function getAndRemoveConfig(str) {
        if ( str === void 0 ) str = '';

        var config = {};

        if (str) {
            str = str
                .replace(/^('|")/, '')
                .replace(/('|")$/, '')
                .replace(/(?:^|\s):([\w-]+:?)=?([\w-%]+)?/g, function (m, key, value) {
                    if (key.indexOf(':') === -1) {
                        config[key] = (value && value.replace(/&quot;/g, '')) || true;
                        return '';
                    }

                    return m;
                })
                .trim();
        }

        return { str: str, config: config };
    }

    /**
     * Remove the <a> tag from sidebar when the header with link, details see issue 1069
     * @param {string}   str   The string to deal with.
     *
     * @return {string}   str   The string after delete the <a> element.
     */
    function removeAtag(str) {
        if ( str === void 0 ) str = '';

        return str.replace(/(<\/?a.*?>)/gi, '');
    }

    var imageCompiler = function (ref) {
        var renderer = ref.renderer;
        var contentBase = ref.contentBase;
        var router = ref.router;

        return (renderer.image = function (href, title, text) {
            var url = href;
            var attrs = [];

            var ref = getAndRemoveConfig(title);
            var str = ref.str;
            var config = ref.config;
            title = str;

            if (config['no-zoom']) {
                attrs.push('data-no-zoom');
            }

            if (title) {
                attrs.push(("title=\"" + title + "\""));
            }

            if (config.size) {
                var ref$1 = config.size.split('x');
                var width = ref$1[0];
                var height = ref$1[1];
                if (height) {
                    attrs.push(("width=\"" + width + "\" height=\"" + height + "\""));
                } else {
                    attrs.push(("width=\"" + width + "\""));
                }
            }

            if (config.class) {
                attrs.push(("class=\"" + (config.class) + "\""));
            }

            if (config.id) {
                attrs.push(("id=\"" + (config.id) + "\""));
            }

            if (!isAbsolutePath(href)) {
                url = getPath(contentBase, getParentPath(router.getCurrentPath()), href);
            }

            if (attrs.length > 0) {
                return ("<img src=\"" + url + "\" data-origin=\"" + href + "\" alt=\"" + text + "\" " + (attrs.join(
                    ' '
                )) + " />");
            }

            return ("<img src=\"" + url + "\" data-origin=\"" + href + "\" alt=\"" + text + "\"" + attrs + ">");
        });
    };

    var prism = createCommonjsModule(function (module) {
        /* **********************************************
       Begin prism-core.js
  ********************************************** */

        /// <reference lib="WebWorker"/>

        var _self = (typeof window !== 'undefined')
            ? window   // if in browser
            : (
                (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope)
                    ? self // if in worker
                    : {}   // if in node js
            );

        /**
         * Prism: Lightweight, robust, elegant syntax highlighting
         *
         * @license MIT <https://opensource.org/licenses/MIT>
         * @author Lea Verou <https://lea.verou.me>
         * @namespace
         * @public
         */
        var Prism = (function (_self) {

            // Private helper vars
            var lang = /(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i;
            var uniqueId = 0;

            // The grammar object for plaintext
            var plainTextGrammar = {};


            var _ = {
                /**
                 * By default, Prism will attempt to highlight all code elements (by calling {@link Prism.highlightAll}) on the
                 * current page after the page finished loading. This might be a problem if e.g. you wanted to asynchronously load
                 * additional languages or plugins yourself.
                 *
                 * By setting this value to `true`, Prism will not automatically highlight all code elements on the page.
                 *
                 * You obviously have to change this value before the automatic highlighting started. To do this, you can add an
                 * empty Prism object into the global scope before loading the Prism script like this:
                 *
                 * ```js
                 * window.Prism = window.Prism || {};
                 * Prism.manual = true;
                 * // add a new <script> to load Prism's script
                 * ```
                 *
                 * @default false
                 * @type {boolean}
                 * @memberof Prism
                 * @public
                 */
                manual: _self.Prism && _self.Prism.manual,
                /**
                 * By default, if Prism is in a web worker, it assumes that it is in a worker it created itself, so it uses
                 * `addEventListener` to communicate with its parent instance. However, if you're using Prism manually in your
                 * own worker, you don't want it to do this.
                 *
                 * By setting this value to `true`, Prism will not add its own listeners to the worker.
                 *
                 * You obviously have to change this value before Prism executes. To do this, you can add an
                 * empty Prism object into the global scope before loading the Prism script like this:
                 *
                 * ```js
                 * window.Prism = window.Prism || {};
                 * Prism.disableWorkerMessageHandler = true;
                 * // Load Prism's script
                 * ```
                 *
                 * @default false
                 * @type {boolean}
                 * @memberof Prism
                 * @public
                 */
                disableWorkerMessageHandler: _self.Prism && _self.Prism.disableWorkerMessageHandler,

                /**
                 * A namespace for utility methods.
                 *
                 * All function in this namespace that are not explicitly marked as _public_ are for __internal use only__ and may
                 * change or disappear at any time.
                 *
                 * @namespace
                 * @memberof Prism
                 */
                util: {
                    encode: function encode(tokens) {
                        if (tokens instanceof Token) {
                            return new Token(tokens.type, encode(tokens.content), tokens.alias);
                        } else if (Array.isArray(tokens)) {
                            return tokens.map(encode);
                        } else {
                            return tokens.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/\u00a0/g, ' ');
                        }
                    },

                    /**
                     * Returns the name of the type of the given value.
                     *
                     * @param {any} o
                     * @returns {string}
                     * @example
                     * type(null)      === 'Null'
                     * type(undefined) === 'Undefined'
                     * type(123)       === 'Number'
                     * type('foo')     === 'String'
                     * type(true)      === 'Boolean'
                     * type([1, 2])    === 'Array'
                     * type({})        === 'Object'
                     * type(String)    === 'Function'
                     * type(/abc+/)    === 'RegExp'
                     */
                    type: function (o) {
                        return Object.prototype.toString.call(o).slice(8, -1);
                    },

                    /**
                     * Returns a unique number for the given object. Later calls will still return the same number.
                     *
                     * @param {Object} obj
                     * @returns {number}
                     */
                    objId: function (obj) {
                        if (!obj['__id']) {
                            Object.defineProperty(obj, '__id', { value: ++uniqueId });
                        }
                        return obj['__id'];
                    },

                    /**
                     * Creates a deep clone of the given object.
                     *
                     * The main intended use of this function is to clone language definitions.
                     *
                     * @param {T} o
                     * @param {Record<number, any>} [visited]
                     * @returns {T}
                     * @template T
                     */
                    clone: function deepClone(o, visited) {
                        visited = visited || {};

                        var clone; var id;
                        switch (_.util.type(o)) {
                            case 'Object':
                                id = _.util.objId(o);
                                if (visited[id]) {
                                    return visited[id];
                                }
                                clone = /** @type {Record<string, any>} */ ({});
                                visited[id] = clone;

                                for (var key in o) {
                                    if (o.hasOwnProperty(key)) {
                                        clone[key] = deepClone(o[key], visited);
                                    }
                                }

                                return /** @type {any} */ (clone);

                            case 'Array':
                                id = _.util.objId(o);
                                if (visited[id]) {
                                    return visited[id];
                                }
                                clone = [];
                                visited[id] = clone;

                                (/** @type {Array} */(/** @type {any} */(o))).forEach(function (v, i) {
                                    clone[i] = deepClone(v, visited);
                                });

                                return /** @type {any} */ (clone);

                            default:
                                return o;
                        }
                    },

                    /**
                     * Returns the Prism language of the given element set by a `language-xxxx` or `lang-xxxx` class.
                     *
                     * If no language is set for the element or the element is `null` or `undefined`, `none` will be returned.
                     *
                     * @param {Element} element
                     * @returns {string}
                     */
                    getLanguage: function (element) {
                        while (element) {
                            var m = lang.exec(element.className);
                            if (m) {
                                return m[1].toLowerCase();
                            }
                            element = element.parentElement;
                        }
                        return 'none';
                    },

                    /**
                     * Sets the Prism `language-xxxx` class of the given element.
                     *
                     * @param {Element} element
                     * @param {string} language
                     * @returns {void}
                     */
                    setLanguage: function (element, language) {
                        // remove all `language-xxxx` classes
                        // (this might leave behind a leading space)
                        element.className = element.className.replace(RegExp(lang, 'gi'), '');

                        // add the new `language-xxxx` class
                        // (using `classList` will automatically clean up spaces for us)
                        element.classList.add('language-' + language);
                    },

                    /**
                     * Returns the script element that is currently executing.
                     *
                     * This does __not__ work for line script element.
                     *
                     * @returns {HTMLScriptElement | null}
                     */
                    currentScript: function () {
                        if (typeof document === 'undefined') {
                            return null;
                        }
                        if ('currentScript' in document && 1 < 2 /* hack to trip TS' flow analysis */) {
                            return /** @type {any} */ (document.currentScript);
                        }

                        // IE11 workaround
                        // we'll get the src of the current script by parsing IE11's error stack trace
                        // this will not work for inline scripts

                        try {
                            throw new Error();
                        } catch (err) {
                            // Get file src url from stack. Specifically works with the format of stack traces in IE.
                            // A stack will look like this:
                            //
                            // Error
                            //    at _.util.currentScript (http://localhost/components/prism-core.js:119:5)
                            //    at Global code (http://localhost/components/prism-core.js:606:1)

                            var src = (/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(err.stack) || [])[1];
                            if (src) {
                                var scripts = document.getElementsByTagName('script');
                                for (var i in scripts) {
                                    if (scripts[i].src == src) {
                                        return scripts[i];
                                    }
                                }
                            }
                            return null;
                        }
                    },

                    /**
                     * Returns whether a given class is active for `element`.
                     *
                     * The class can be activated if `element` or one of its ancestors has the given class and it can be deactivated
                     * if `element` or one of its ancestors has the negated version of the given class. The _negated version_ of the
                     * given class is just the given class with a `no-` prefix.
                     *
                     * Whether the class is active is determined by the closest ancestor of `element` (where `element` itself is
                     * closest ancestor) that has the given class or the negated version of it. If neither `element` nor any of its
                     * ancestors have the given class or the negated version of it, then the default activation will be returned.
                     *
                     * In the paradoxical situation where the closest ancestor contains __both__ the given class and the negated
                     * version of it, the class is considered active.
                     *
                     * @param {Element} element
                     * @param {string} className
                     * @param {boolean} [defaultActivation=false]
                     * @returns {boolean}
                     */
                    isActive: function (element, className, defaultActivation) {
                        var no = 'no-' + className;

                        while (element) {
                            var classList = element.classList;
                            if (classList.contains(className)) {
                                return true;
                            }
                            if (classList.contains(no)) {
                                return false;
                            }
                            element = element.parentElement;
                        }
                        return !!defaultActivation;
                    }
                },

                /**
                 * This namespace contains all currently loaded languages and the some helper functions to create and modify languages.
                 *
                 * @namespace
                 * @memberof Prism
                 * @public
                 */
                languages: {
                    /**
                     * The grammar for plain, unformatted text.
                     */
                    plain: plainTextGrammar,
                    plaintext: plainTextGrammar,
                    text: plainTextGrammar,
                    txt: plainTextGrammar,

                    /**
                     * Creates a deep copy of the language with the given id and appends the given tokens.
                     *
                     * If a token in `redef` also appears in the copied language, then the existing token in the copied language
                     * will be overwritten at its original position.
                     *
                     * ## Best practices
                     *
                     * Since the position of overwriting tokens (token in `redef` that overwrite tokens in the copied language)
                     * doesn't matter, they can technically be in any order. However, this can be confusing to others that trying to
                     * understand the language definition because, normally, the order of tokens matters in Prism grammars.
                     *
                     * Therefore, it is encouraged to order overwriting tokens according to the positions of the overwritten tokens.
                     * Furthermore, all non-overwriting tokens should be placed after the overwriting ones.
                     *
                     * @param {string} id The id of the language to extend. This has to be a key in `Prism.languages`.
                     * @param {Grammar} redef The new tokens to append.
                     * @returns {Grammar} The new language created.
                     * @public
                     * @example
                     * Prism.languages['css-with-colors'] = Prism.languages.extend('css', {
                     *     // Prism.languages.css already has a 'comment' token, so this token will overwrite CSS' 'comment' token
                     *     // at its original position
                     *     'comment': { ... },
                     *     // CSS doesn't have a 'color' token, so this token will be appended
                     *     'color': /\b(?:red|green|blue)\b/
                     * });
                     */
                    extend: function (id, redef) {
                        var lang = _.util.clone(_.languages[id]);

                        for (var key in redef) {
                            lang[key] = redef[key];
                        }

                        return lang;
                    },

                    /**
                     * Inserts tokens _before_ another token in a language definition or any other grammar.
                     *
                     * ## Usage
                     *
                     * This helper method makes it easy to modify existing languages. For example, the CSS language definition
                     * not only defines CSS highlighting for CSS documents, but also needs to define highlighting for CSS embedded
                     * in HTML through `<style>` elements. To do this, it needs to modify `Prism.languages.markup` and add the
                     * appropriate tokens. However, `Prism.languages.markup` is a regular JavaScript object literal, so if you do
                     * this:
                     *
                     * ```js
                     * Prism.languages.markup.style = {
                     *     // token
                     * };
                     * ```
                     *
                     * then the `style` token will be added (and processed) at the end. `insertBefore` allows you to insert tokens
                     * before existing tokens. For the CSS example above, you would use it like this:
                     *
                     * ```js
                     * Prism.languages.insertBefore('markup', 'cdata', {
                     *     'style': {
                     *         // token
                     *     }
                     * });
                     * ```
                     *
                     * ## Special cases
                     *
                     * If the grammars of `inside` and `insert` have tokens with the same name, the tokens in `inside`'s grammar
                     * will be ignored.
                     *
                     * This behavior can be used to insert tokens after `before`:
                     *
                     * ```js
                     * Prism.languages.insertBefore('markup', 'comment', {
                     *     'comment': Prism.languages.markup.comment,
                     *     // tokens after 'comment'
                     * });
                     * ```
                     *
                     * ## Limitations
                     *
                     * The main problem `insertBefore` has to solve is iteration order. Since ES2015, the iteration order for object
                     * properties is guaranteed to be the insertion order (except for integer keys) but some browsers behave
                     * differently when keys are deleted and re-inserted. So `insertBefore` can't be implemented by temporarily
                     * deleting properties which is necessary to insert at arbitrary positions.
                     *
                     * To solve this problem, `insertBefore` doesn't actually insert the given tokens into the target object.
                     * Instead, it will create a new object and replace all references to the target object with the new one. This
                     * can be done without temporarily deleting properties, so the iteration order is well-defined.
                     *
                     * However, only references that can be reached from `Prism.languages` or `insert` will be replaced. I.e. if
                     * you hold the target object in a variable, then the value of the variable will not change.
                     *
                     * ```js
                     * var oldMarkup = Prism.languages.markup;
                     * var newMarkup = Prism.languages.insertBefore('markup', 'comment', { ... });
                     *
                     * assert(oldMarkup !== Prism.languages.markup);
                     * assert(newMarkup === Prism.languages.markup);
                     * ```
                     *
                     * @param {string} inside The property of `root` (e.g. a language id in `Prism.languages`) that contains the
                     * object to be modified.
                     * @param {string} before The key to insert before.
                     * @param {Grammar} insert An object containing the key-value pairs to be inserted.
                     * @param {Object<string, any>} [root] The object containing `inside`, i.e. the object that contains the
                     * object to be modified.
                     *
                     * Defaults to `Prism.languages`.
                     * @returns {Grammar} The new grammar object.
                     * @public
                     */
                    insertBefore: function (inside, before, insert, root) {
                        root = root || /** @type {any} */ (_.languages);
                        var grammar = root[inside];
                        /** @type {Grammar} */
                        var ret = {};

                        for (var token in grammar) {
                            if (grammar.hasOwnProperty(token)) {

                                if (token == before) {
                                    for (var newToken in insert) {
                                        if (insert.hasOwnProperty(newToken)) {
                                            ret[newToken] = insert[newToken];
                                        }
                                    }
                                }

                                // Do not insert token which also occur in insert. See #1525
                                if (!insert.hasOwnProperty(token)) {
                                    ret[token] = grammar[token];
                                }
                            }
                        }

                        var old = root[inside];
                        root[inside] = ret;

                        // Update references in other language definitions
                        _.languages.DFS(_.languages, function (key, value) {
                            if (value === old && key != inside) {
                                this[key] = ret;
                            }
                        });

                        return ret;
                    },

                    // Traverse a language definition with Depth First Search
                    DFS: function DFS(o, callback, type, visited) {
                        visited = visited || {};

                        var objId = _.util.objId;

                        for (var i in o) {
                            if (o.hasOwnProperty(i)) {
                                callback.call(o, i, o[i], type || i);

                                var property = o[i];
                                var propertyType = _.util.type(property);

                                if (propertyType === 'Object' && !visited[objId(property)]) {
                                    visited[objId(property)] = true;
                                    DFS(property, callback, null, visited);
                                } else if (propertyType === 'Array' && !visited[objId(property)]) {
                                    visited[objId(property)] = true;
                                    DFS(property, callback, i, visited);
                                }
                            }
                        }
                    }
                },

                plugins: {},

                /**
                 * This is the most high-level function in Prism’s API.
                 * It fetches all the elements that have a `.language-xxxx` class and then calls {@link Prism.highlightElement} on
                 * each one of them.
                 *
                 * This is equivalent to `Prism.highlightAllUnder(document, async, callback)`.
                 *
                 * @param {boolean} [async=false] Same as in {@link Prism.highlightAllUnder}.
                 * @param {HighlightCallback} [callback] Same as in {@link Prism.highlightAllUnder}.
                 * @memberof Prism
                 * @public
                 */
                highlightAll: function (async, callback) {
                    _.highlightAllUnder(document, async, callback);
                },

                /**
                 * Fetches all the descendants of `container` that have a `.language-xxxx` class and then calls
                 * {@link Prism.highlightElement} on each one of them.
                 *
                 * The following hooks will be run:
                 * 1. `before-highlightall`
                 * 2. `before-all-elements-highlight`
                 * 3. All hooks of {@link Prism.highlightElement} for each element.
                 *
                 * @param {ParentNode} container The root element, whose descendants that have a `.language-xxxx` class will be highlighted.
                 * @param {boolean} [async=false] Whether each element is to be highlighted asynchronously using Web Workers.
                 * @param {HighlightCallback} [callback] An optional callback to be invoked on each element after its highlighting is done.
                 * @memberof Prism
                 * @public
                 */
                highlightAllUnder: function (container, async, callback) {
                    var env = {
                        callback: callback,
                        container: container,
                        selector: 'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'
                    };

                    _.hooks.run('before-highlightall', env);

                    env.elements = Array.prototype.slice.apply(env.container.querySelectorAll(env.selector));

                    _.hooks.run('before-all-elements-highlight', env);

                    for (var i = 0, element; (element = env.elements[i++]);) {
                        _.highlightElement(element, async === true, env.callback);
                    }
                },

                /**
                 * Highlights the code inside a single element.
                 *
                 * The following hooks will be run:
                 * 1. `before-sanity-check`
                 * 2. `before-highlight`
                 * 3. All hooks of {@link Prism.highlight}. These hooks will be run by an asynchronous worker if `async` is `true`.
                 * 4. `before-insert`
                 * 5. `after-highlight`
                 * 6. `complete`
                 *
                 * Some the above hooks will be skipped if the element doesn't contain any text or there is no grammar loaded for
                 * the element's language.
                 *
                 * @param {Element} element The element containing the code.
                 * It must have a class of `language-xxxx` to be processed, where `xxxx` is a valid language identifier.
                 * @param {boolean} [async=false] Whether the element is to be highlighted asynchronously using Web Workers
                 * to improve performance and avoid blocking the UI when highlighting very large chunks of code. This option is
                 * [disabled by default](https://prismjs.com/faq.html#why-is-asynchronous-highlighting-disabled-by-default).
                 *
                 * Note: All language definitions required to highlight the code must be included in the main `prism.js` file for
                 * asynchronous highlighting to work. You can build your own bundle on the
                 * [Download page](https://prismjs.com/download.html).
                 * @param {HighlightCallback} [callback] An optional callback to be invoked after the highlighting is done.
                 * Mostly useful when `async` is `true`, since in that case, the highlighting is done asynchronously.
                 * @memberof Prism
                 * @public
                 */
                highlightElement: function (element, async, callback) {
                    // Find language
                    var language = _.util.getLanguage(element);
                    var grammar = _.languages[language];

                    // Set language on the element, if not present
                    _.util.setLanguage(element, language);

                    // Set language on the parent, for styling
                    var parent = element.parentElement;
                    if (parent && parent.nodeName.toLowerCase() === 'pre') {
                        _.util.setLanguage(parent, language);
                    }

                    var code = element.textContent;

                    var env = {
                        element: element,
                        language: language,
                        grammar: grammar,
                        code: code
                    };

                    function insertHighlightedCode(highlightedCode) {
                        env.highlightedCode = highlightedCode;

                        _.hooks.run('before-insert', env);

                        env.element.innerHTML = env.highlightedCode;

                        _.hooks.run('after-highlight', env);
                        _.hooks.run('complete', env);
                        callback && callback.call(env.element);
                    }

                    _.hooks.run('before-sanity-check', env);

                    // plugins may change/add the parent/element
                    parent = env.element.parentElement;
                    if (parent && parent.nodeName.toLowerCase() === 'pre' && !parent.hasAttribute('tabindex')) {
                        parent.setAttribute('tabindex', '0');
                    }

                    if (!env.code) {
                        _.hooks.run('complete', env);
                        callback && callback.call(env.element);
                        return;
                    }

                    _.hooks.run('before-highlight', env);

                    if (!env.grammar) {
                        insertHighlightedCode(_.util.encode(env.code));
                        return;
                    }

                    if (async && _self.Worker) {
                        var worker = new Worker(_.filename);

                        worker.onmessage = function (evt) {
                            insertHighlightedCode(evt.data);
                        };

                        worker.postMessage(JSON.stringify({
                            language: env.language,
                            code: env.code,
                            immediateClose: true
                        }));
                    } else {
                        insertHighlightedCode(_.highlight(env.code, env.grammar, env.language));
                    }
                },

                /**
                 * Low-level function, only use if you know what you’re doing. It accepts a string of text as input
                 * and the language definitions to use, and returns a string with the HTML produced.
                 *
                 * The following hooks will be run:
                 * 1. `before-tokenize`
                 * 2. `after-tokenize`
                 * 3. `wrap`: On each {@link Token}.
                 *
                 * @param {string} text A string with the code to be highlighted.
                 * @param {Grammar} grammar An object containing the tokens to use.
                 *
                 * Usually a language definition like `Prism.languages.markup`.
                 * @param {string} language The name of the language definition passed to `grammar`.
                 * @returns {string} The highlighted HTML.
                 * @memberof Prism
                 * @public
                 * @example
                 * Prism.highlight('var foo = true;', Prism.languages.javascript, 'javascript');
                 */
                highlight: function (text, grammar, language) {
                    var env = {
                        code: text,
                        grammar: grammar,
                        language: language
                    };
                    _.hooks.run('before-tokenize', env);
                    if (!env.grammar) {
                        throw new Error('The language "' + env.language + '" has no grammar.');
                    }
                    env.tokens = _.tokenize(env.code, env.grammar);
                    _.hooks.run('after-tokenize', env);
                    return Token.stringify(_.util.encode(env.tokens), env.language);
                },

                /**
                 * This is the heart of Prism, and the most low-level function you can use. It accepts a string of text as input
                 * and the language definitions to use, and returns an array with the tokenized code.
                 *
                 * When the language definition includes nested tokens, the function is called recursively on each of these tokens.
                 *
                 * This method could be useful in other contexts as well, as a very crude parser.
                 *
                 * @param {string} text A string with the code to be highlighted.
                 * @param {Grammar} grammar An object containing the tokens to use.
                 *
                 * Usually a language definition like `Prism.languages.markup`.
                 * @returns {TokenStream} An array of strings and tokens, a token stream.
                 * @memberof Prism
                 * @public
                 * @example
                 * let code = `var foo = 0;`;
                 * let tokens = Prism.tokenize(code, Prism.languages.javascript);
                 * tokens.forEach(token => {
                 *     if (token instanceof Prism.Token && token.type === 'number') {
                 *         console.log(`Found numeric literal: ${token.content}`);
                 *     }
                 * });
                 */
                tokenize: function (text, grammar) {
                    var rest = grammar.rest;
                    if (rest) {
                        for (var token in rest) {
                            grammar[token] = rest[token];
                        }

                        delete grammar.rest;
                    }

                    var tokenList = new LinkedList();
                    addAfter(tokenList, tokenList.head, text);

                    matchGrammar(text, tokenList, grammar, tokenList.head, 0);

                    return toArray(tokenList);
                },

                /**
                 * @namespace
                 * @memberof Prism
                 * @public
                 */
                hooks: {
                    all: {},

                    /**
                     * Adds the given callback to the list of callbacks for the given hook.
                     *
                     * The callback will be invoked when the hook it is registered for is run.
                     * Hooks are usually directly run by a highlight function but you can also run hooks yourself.
                     *
                     * One callback function can be registered to multiple hooks and the same hook multiple times.
                     *
                     * @param {string} name The name of the hook.
                     * @param {HookCallback} callback The callback function which is given environment variables.
                     * @public
                     */
                    add: function (name, callback) {
                        var hooks = _.hooks.all;

                        hooks[name] = hooks[name] || [];

                        hooks[name].push(callback);
                    },

                    /**
                     * Runs a hook invoking all registered callbacks with the given environment variables.
                     *
                     * Callbacks will be invoked synchronously and in the order in which they were registered.
                     *
                     * @param {string} name The name of the hook.
                     * @param {Object<string, any>} env The environment variables of the hook passed to all callbacks registered.
                     * @public
                     */
                    run: function (name, env) {
                        var callbacks = _.hooks.all[name];

                        if (!callbacks || !callbacks.length) {
                            return;
                        }

                        for (var i = 0, callback; (callback = callbacks[i++]);) {
                            callback(env);
                        }
                    }
                },

                Token: Token
            };
            _self.Prism = _;


            // Typescript note:
            // The following can be used to import the Token type in JSDoc:
            //
            //   @typedef {InstanceType<import("./prism-core")["Token"]>} Token

            /**
             * Creates a new token.
             *
             * @param {string} type See {@link Token#type type}
             * @param {string | TokenStream} content See {@link Token#content content}
             * @param {string|string[]} [alias] The alias(es) of the token.
             * @param {string} [matchedStr=""] A copy of the full string this token was created from.
             * @class
             * @global
             * @public
             */
            function Token(type, content, alias, matchedStr) {
                /**
                 * The type of the token.
                 *
                 * This is usually the key of a pattern in a {@link Grammar}.
                 *
                 * @type {string}
                 * @see GrammarToken
                 * @public
                 */
                this.type = type;
                /**
                 * The strings or tokens contained by this token.
                 *
                 * This will be a token stream if the pattern matched also defined an `inside` grammar.
                 *
                 * @type {string | TokenStream}
                 * @public
                 */
                this.content = content;
                /**
                 * The alias(es) of the token.
                 *
                 * @type {string|string[]}
                 * @see GrammarToken
                 * @public
                 */
                this.alias = alias;
                // Copy of the full string this token was created from
                this.length = (matchedStr || '').length | 0;
            }

            /**
             * A token stream is an array of strings and {@link Token Token} objects.
             *
             * Token streams have to fulfill a few properties that are assumed by most functions (mostly internal ones) that process
             * them.
             *
             * 1. No adjacent strings.
             * 2. No empty strings.
             *
             *    The only exception here is the token stream that only contains the empty string and nothing else.
             *
             * @typedef {Array<string | Token>} TokenStream
             * @global
             * @public
             */

            /**
             * Converts the given token or token stream to an HTML representation.
             *
             * The following hooks will be run:
             * 1. `wrap`: On each {@link Token}.
             *
             * @param {string | Token | TokenStream} o The token or token stream to be converted.
             * @param {string} language The name of current language.
             * @returns {string} The HTML representation of the token or token stream.
             * @memberof Token
             * @static
             */
            Token.stringify = function stringify(o, language) {
                if (typeof o == 'string') {
                    return o;
                }
                if (Array.isArray(o)) {
                    var s = '';
                    o.forEach(function (e) {
                        s += stringify(e, language);
                    });
                    return s;
                }

                var env = {
                    type: o.type,
                    content: stringify(o.content, language),
                    tag: 'span',
                    classes: ['token', o.type],
                    attributes: {},
                    language: language
                };

                var aliases = o.alias;
                if (aliases) {
                    if (Array.isArray(aliases)) {
                        Array.prototype.push.apply(env.classes, aliases);
                    } else {
                        env.classes.push(aliases);
                    }
                }

                _.hooks.run('wrap', env);

                var attributes = '';
                for (var name in env.attributes) {
                    attributes += ' ' + name + '="' + (env.attributes[name] || '').replace(/"/g, '&quot;') + '"';
                }

                return '<' + env.tag + ' class="' + env.classes.join(' ') + '"' + attributes + '>' + env.content + '</' + env.tag + '>';
            };

            /**
             * @param {RegExp} pattern
             * @param {number} pos
             * @param {string} text
             * @param {boolean} lookbehind
             * @returns {RegExpExecArray | null}
             */
            function matchPattern(pattern, pos, text, lookbehind) {
                pattern.lastIndex = pos;
                var match = pattern.exec(text);
                if (match && lookbehind && match[1]) {
                    // change the match to remove the text matched by the Prism lookbehind group
                    var lookbehindLength = match[1].length;
                    match.index += lookbehindLength;
                    match[0] = match[0].slice(lookbehindLength);
                }
                return match;
            }

            /**
             * @param {string} text
             * @param {LinkedList<string | Token>} tokenList
             * @param {any} grammar
             * @param {LinkedListNode<string | Token>} startNode
             * @param {number} startPos
             * @param {RematchOptions} [rematch]
             * @returns {void}
             * @private
             *
             * @typedef RematchOptions
             * @property {string} cause
             * @property {number} reach
             */
            function matchGrammar(text, tokenList, grammar, startNode, startPos, rematch) {
                for (var token in grammar) {
                    if (!grammar.hasOwnProperty(token) || !grammar[token]) {
                        continue;
                    }

                    var patterns = grammar[token];
                    patterns = Array.isArray(patterns) ? patterns : [patterns];

                    for (var j = 0; j < patterns.length; ++j) {
                        if (rematch && rematch.cause == token + ',' + j) {
                            return;
                        }

                        var patternObj = patterns[j];
                        var inside = patternObj.inside;
                        var lookbehind = !!patternObj.lookbehind;
                        var greedy = !!patternObj.greedy;
                        var alias = patternObj.alias;

                        if (greedy && !patternObj.pattern.global) {
                            // Without the global flag, lastIndex won't work
                            var flags = patternObj.pattern.toString().match(/[imsuy]*$/)[0];
                            patternObj.pattern = RegExp(patternObj.pattern.source, flags + 'g');
                        }

                        /** @type {RegExp} */
                        var pattern = patternObj.pattern || patternObj;

                        for ( // iterate the token list and keep track of the current token/string position
                            var currentNode = startNode.next, pos = startPos;
                            currentNode !== tokenList.tail;
                            pos += currentNode.value.length, currentNode = currentNode.next
                        ) {

                            if (rematch && pos >= rematch.reach) {
                                break;
                            }

                            var str = currentNode.value;

                            if (tokenList.length > text.length) {
                                // Something went terribly wrong, ABORT, ABORT!
                                return;
                            }

                            if (str instanceof Token) {
                                continue;
                            }

                            var removeCount = 1; // this is the to parameter of removeBetween
                            var match;

                            if (greedy) {
                                match = matchPattern(pattern, pos, text, lookbehind);
                                if (!match || match.index >= text.length) {
                                    break;
                                }

                                var from = match.index;
                                var to = match.index + match[0].length;
                                var p = pos;

                                // find the node that contains the match
                                p += currentNode.value.length;
                                while (from >= p) {
                                    currentNode = currentNode.next;
                                    p += currentNode.value.length;
                                }
                                // adjust pos (and p)
                                p -= currentNode.value.length;
                                pos = p;

                                // the current node is a Token, then the match starts inside another Token, which is invalid
                                if (currentNode.value instanceof Token) {
                                    continue;
                                }

                                // find the last node which is affected by this match
                                for (
                                    var k = currentNode;
                                    k !== tokenList.tail && (p < to || typeof k.value === 'string');
                                    k = k.next
                                ) {
                                    removeCount++;
                                    p += k.value.length;
                                }
                                removeCount--;

                                // replace with the new match
                                str = text.slice(pos, p);
                                match.index -= pos;
                            } else {
                                match = matchPattern(pattern, 0, str, lookbehind);
                                if (!match) {
                                    continue;
                                }
                            }

                            // eslint-disable-next-line no-redeclare
                            var from = match.index;
                            var matchStr = match[0];
                            var before = str.slice(0, from);
                            var after = str.slice(from + matchStr.length);

                            var reach = pos + str.length;
                            if (rematch && reach > rematch.reach) {
                                rematch.reach = reach;
                            }

                            var removeFrom = currentNode.prev;

                            if (before) {
                                removeFrom = addAfter(tokenList, removeFrom, before);
                                pos += before.length;
                            }

                            removeRange(tokenList, removeFrom, removeCount);

                            var wrapped = new Token(token, inside ? _.tokenize(matchStr, inside) : matchStr, alias, matchStr);
                            currentNode = addAfter(tokenList, removeFrom, wrapped);

                            if (after) {
                                addAfter(tokenList, currentNode, after);
                            }

                            if (removeCount > 1) {
                                // at least one Token object was removed, so we have to do some rematching
                                // this can only happen if the current pattern is greedy

                                /** @type {RematchOptions} */
                                var nestedRematch = {
                                    cause: token + ',' + j,
                                    reach: reach
                                };
                                matchGrammar(text, tokenList, grammar, currentNode.prev, pos, nestedRematch);

                                // the reach might have been extended because of the rematching
                                if (rematch && nestedRematch.reach > rematch.reach) {
                                    rematch.reach = nestedRematch.reach;
                                }
                            }
                        }
                    }
                }
            }

            /**
             * @typedef LinkedListNode
             * @property {T} value
             * @property {LinkedListNode<T> | null} prev The previous node.
             * @property {LinkedListNode<T> | null} next The next node.
             * @template T
             * @private
             */

            /**
             * @template T
             * @private
             */
            function LinkedList() {
                /** @type {LinkedListNode<T>} */
                var head = { value: null, prev: null, next: null };
                /** @type {LinkedListNode<T>} */
                var tail = { value: null, prev: head, next: null };
                head.next = tail;

                /** @type {LinkedListNode<T>} */
                this.head = head;
                /** @type {LinkedListNode<T>} */
                this.tail = tail;
                this.length = 0;
            }

            /**
             * Adds a new node with the given value to the list.
             *
             * @param {LinkedList<T>} list
             * @param {LinkedListNode<T>} node
             * @param {T} value
             * @returns {LinkedListNode<T>} The added node.
             * @template T
             */
            function addAfter(list, node, value) {
                // assumes that node != list.tail && values.length >= 0
                var next = node.next;

                var newNode = { value: value, prev: node, next: next };
                node.next = newNode;
                next.prev = newNode;
                list.length++;

                return newNode;
            }
            /**
             * Removes `count` nodes after the given node. The given node will not be removed.
             *
             * @param {LinkedList<T>} list
             * @param {LinkedListNode<T>} node
             * @param {number} count
             * @template T
             */
            function removeRange(list, node, count) {
                var next = node.next;
                for (var i = 0; i < count && next !== list.tail; i++) {
                    next = next.next;
                }
                node.next = next;
                next.prev = node;
                list.length -= i;
            }
            /**
             * @param {LinkedList<T>} list
             * @returns {T[]}
             * @template T
             */
            function toArray(list) {
                var array = [];
                var node = list.head.next;
                while (node !== list.tail) {
                    array.push(node.value);
                    node = node.next;
                }
                return array;
            }


            if (!_self.document) {
                if (!_self.addEventListener) {
                    // in Node.js
                    return _;
                }

                if (!_.disableWorkerMessageHandler) {
                    // In worker
                    _self.addEventListener('message', function (evt) {
                        var message = JSON.parse(evt.data);
                        var lang = message.language;
                        var code = message.code;
                        var immediateClose = message.immediateClose;

                        _self.postMessage(_.highlight(code, _.languages[lang], lang));
                        if (immediateClose) {
                            _self.close();
                        }
                    }, false);
                }

                return _;
            }

            // Get current script and highlight
            var script = _.util.currentScript();

            if (script) {
                _.filename = script.src;

                if (script.hasAttribute('data-manual')) {
                    _.manual = true;
                }
            }

            function highlightAutomaticallyCallback() {
                if (!_.manual) {
                    _.highlightAll();
                }
            }

            if (!_.manual) {
                // If the document state is "loading", then we'll use DOMContentLoaded.
                // If the document state is "interactive" and the prism.js script is deferred, then we'll also use the
                // DOMContentLoaded event because there might be some plugins or languages which have also been deferred and they
                // might take longer one animation frame to execute which can create a race condition where only some plugins have
                // been loaded when Prism.highlightAll() is executed, depending on how fast resources are loaded.
                // See https://github.com/PrismJS/prism/issues/2102
                var readyState = document.readyState;
                if (readyState === 'loading' || readyState === 'interactive' && script && script.defer) {
                    document.addEventListener('DOMContentLoaded', highlightAutomaticallyCallback);
                } else {
                    if (window.requestAnimationFrame) {
                        window.requestAnimationFrame(highlightAutomaticallyCallback);
                    } else {
                        window.setTimeout(highlightAutomaticallyCallback, 16);
                    }
                }
            }

            return _;

        }(_self));

        if ( module.exports) {
            module.exports = Prism;
        }

        // hack for components to work correctly in node.js
        if (typeof commonjsGlobal !== 'undefined') {
            commonjsGlobal.Prism = Prism;
        }

        // some additional documentation/types

        /**
         * The expansion of a simple `RegExp` literal to support additional properties.
         *
         * @typedef GrammarToken
         * @property {RegExp} pattern The regular expression of the token.
         * @property {boolean} [lookbehind=false] If `true`, then the first capturing group of `pattern` will (effectively)
         * behave as a lookbehind group meaning that the captured text will not be part of the matched text of the new token.
         * @property {boolean} [greedy=false] Whether the token is greedy.
         * @property {string|string[]} [alias] An optional alias or list of aliases.
         * @property {Grammar} [inside] The nested grammar of this token.
         *
         * The `inside` grammar will be used to tokenize the text value of each token of this kind.
         *
         * This can be used to make nested and even recursive language definitions.
         *
         * Note: This can cause infinite recursion. Be careful when you embed different languages or even the same language into
         * each another.
         * @global
         * @public
         */

        /**
         * @typedef Grammar
         * @type {Object<string, RegExp | GrammarToken | Array<RegExp | GrammarToken>>}
         * @property {Grammar} [rest] An optional grammar object that will be appended to this grammar.
         * @global
         * @public
         */

        /**
         * A function which will invoked after an element was successfully highlighted.
         *
         * @callback HighlightCallback
         * @param {Element} element The element successfully highlighted.
         * @returns {void}
         * @global
         * @public
         */

        /**
         * @callback HookCallback
         * @param {Object<string, any>} env The environment variables of the hook.
         * @returns {void}
         * @global
         * @public
         */


        /* **********************************************
       Begin prism-markup.js
  ********************************************** */

        Prism.languages.markup = {
            'comment': {
                pattern: /<!--(?:(?!<!--)[\s\S])*?-->/,
                greedy: true
            },
            'prolog': {
                pattern: /<\?[\s\S]+?\?>/,
                greedy: true
            },
            'doctype': {
                // https://www.w3.org/TR/xml/#NT-doctypedecl
                pattern: /<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,
                greedy: true,
                inside: {
                    'internal-subset': {
                        pattern: /(^[^\[]*\[)[\s\S]+(?=\]>$)/,
                        lookbehind: true,
                        greedy: true,
                        inside: null // see below
                    },
                    'string': {
                        pattern: /"[^"]*"|'[^']*'/,
                        greedy: true
                    },
                    'punctuation': /^<!|>$|[[\]]/,
                    'doctype-tag': /^DOCTYPE/i,
                    'name': /[^\s<>'"]+/
                }
            },
            'cdata': {
                pattern: /<!\[CDATA\[[\s\S]*?\]\]>/i,
                greedy: true
            },
            'tag': {
                pattern: /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,
                greedy: true,
                inside: {
                    'tag': {
                        pattern: /^<\/?[^\s>\/]+/,
                        inside: {
                            'punctuation': /^<\/?/,
                            'namespace': /^[^\s>\/:]+:/
                        }
                    },
                    'special-attr': [],
                    'attr-value': {
                        pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,
                        inside: {
                            'punctuation': [
                                {
                                    pattern: /^=/,
                                    alias: 'attr-equals'
                                },
                                /"|'/
                            ]
                        }
                    },
                    'punctuation': /\/?>/,
                    'attr-name': {
                        pattern: /[^\s>\/]+/,
                        inside: {
                            'namespace': /^[^\s>\/:]+:/
                        }
                    }

                }
            },
            'entity': [
                {
                    pattern: /&[\da-z]{1,8};/i,
                    alias: 'named-entity'
                },
                /&#x?[\da-f]{1,8};/i
            ]
        };

        Prism.languages.markup['tag'].inside['attr-value'].inside['entity'] =
            Prism.languages.markup['entity'];
        Prism.languages.markup['doctype'].inside['internal-subset'].inside = Prism.languages.markup;

        // Plugin to make entity title show the real entity, idea by Roman Komarov
        Prism.hooks.add('wrap', function (env) {

            if (env.type === 'entity') {
                env.attributes['title'] = env.content.replace(/&amp;/, '&');
            }
        });

        Object.defineProperty(Prism.languages.markup.tag, 'addInlined', {
            /**
             * Adds an inlined language to markup.
             *
             * An example of an inlined language is CSS with `<style>` tags.
             *
             * @param {string} tagName The name of the tag that contains the inlined language. This name will be treated as
             * case insensitive.
             * @param {string} lang The language key.
             * @example
             * addInlined('style', 'css');
             */
            value: function addInlined(tagName, lang) {
                var includedCdataInside = {};
                includedCdataInside['language-' + lang] = {
                    pattern: /(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,
                    lookbehind: true,
                    inside: Prism.languages[lang]
                };
                includedCdataInside['cdata'] = /^<!\[CDATA\[|\]\]>$/i;

                var inside = {
                    'included-cdata': {
                        pattern: /<!\[CDATA\[[\s\S]*?\]\]>/i,
                        inside: includedCdataInside
                    }
                };
                inside['language-' + lang] = {
                    pattern: /[\s\S]+/,
                    inside: Prism.languages[lang]
                };

                var def = {};
                def[tagName] = {
                    pattern: RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g, function () { return tagName; }), 'i'),
                    lookbehind: true,
                    greedy: true,
                    inside: inside
                };

                Prism.languages.insertBefore('markup', 'cdata', def);
            }
        });
        Object.defineProperty(Prism.languages.markup.tag, 'addAttribute', {
            /**
             * Adds an pattern to highlight languages embedded in HTML attributes.
             *
             * An example of an inlined language is CSS with `style` attributes.
             *
             * @param {string} attrName The name of the tag that contains the inlined language. This name will be treated as
             * case insensitive.
             * @param {string} lang The language key.
             * @example
             * addAttribute('style', 'css');
             */
            value: function (attrName, lang) {
                Prism.languages.markup.tag.inside['special-attr'].push({
                    pattern: RegExp(
                        /(^|["'\s])/.source + '(?:' + attrName + ')' + /\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,
                        'i'
                    ),
                    lookbehind: true,
                    inside: {
                        'attr-name': /^[^\s=]+/,
                        'attr-value': {
                            pattern: /=[\s\S]+/,
                            inside: {
                                'value': {
                                    pattern: /(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,
                                    lookbehind: true,
                                    alias: [lang, 'language-' + lang],
                                    inside: Prism.languages[lang]
                                },
                                'punctuation': [
                                    {
                                        pattern: /^=/,
                                        alias: 'attr-equals'
                                    },
                                    /"|'/
                                ]
                            }
                        }
                    }
                });
            }
        });

        Prism.languages.html = Prism.languages.markup;
        Prism.languages.mathml = Prism.languages.markup;
        Prism.languages.svg = Prism.languages.markup;

        Prism.languages.xml = Prism.languages.extend('markup', {});
        Prism.languages.ssml = Prism.languages.xml;
        Prism.languages.atom = Prism.languages.xml;
        Prism.languages.rss = Prism.languages.xml;


        /* **********************************************
       Begin prism-css.js
  ********************************************** */

        (function (Prism) {

            var string = /(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;

            Prism.languages.css = {
                'comment': /\/\*[\s\S]*?\*\//,
                'atrule': {
                    pattern: /@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,
                    inside: {
                        'rule': /^@[\w-]+/,
                        'selector-function-argument': {
                            pattern: /(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,
                            lookbehind: true,
                            alias: 'selector'
                        },
                        'keyword': {
                            pattern: /(^|[^\w-])(?:and|not|only|or)(?![\w-])/,
                            lookbehind: true
                        }
                        // See rest below
                    }
                },
                'url': {
                    // https://drafts.csswg.org/css-values-3/#urls
                    pattern: RegExp('\\burl\\((?:' + string.source + '|' + /(?:[^\\\r\n()"']|\\[\s\S])*/.source + ')\\)', 'i'),
                    greedy: true,
                    inside: {
                        'function': /^url/i,
                        'punctuation': /^\(|\)$/,
                        'string': {
                            pattern: RegExp('^' + string.source + '$'),
                            alias: 'url'
                        }
                    }
                },
                'selector': {
                    pattern: RegExp('(^|[{}\\s])[^{}\\s](?:[^{};"\'\\s]|\\s+(?![\\s{])|' + string.source + ')*(?=\\s*\\{)'),
                    lookbehind: true
                },
                'string': {
                    pattern: string,
                    greedy: true
                },
                'property': {
                    pattern: /(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,
                    lookbehind: true
                },
                'important': /!important\b/i,
                'function': {
                    pattern: /(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,
                    lookbehind: true
                },
                'punctuation': /[(){};:,]/
            };

            Prism.languages.css['atrule'].inside.rest = Prism.languages.css;

            var markup = Prism.languages.markup;
            if (markup) {
                markup.tag.addInlined('style', 'css');
                markup.tag.addAttribute('style', 'css');
            }

        }(Prism));


        /* **********************************************
       Begin prism-clike.js
  ********************************************** */

        Prism.languages.clike = {
            'comment': [
                {
                    pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
                    lookbehind: true,
                    greedy: true
                },
                {
                    pattern: /(^|[^\\:])\/\/.*/,
                    lookbehind: true,
                    greedy: true
                }
            ],
            'string': {
                pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
                greedy: true
            },
            'class-name': {
                pattern: /(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,
                lookbehind: true,
                inside: {
                    'punctuation': /[.\\]/
                }
            },
            'keyword': /\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,
            'boolean': /\b(?:false|true)\b/,
            'function': /\b\w+(?=\()/,
            'number': /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,
            'operator': /[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,
            'punctuation': /[{}[\];(),.:]/
        };


        /* **********************************************
       Begin prism-javascript.js
  ********************************************** */

        Prism.languages.javascript = Prism.languages.extend('clike', {
            'class-name': [
                Prism.languages.clike['class-name'],
                {
                    pattern: /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,
                    lookbehind: true
                }
            ],
            'keyword': [
                {
                    pattern: /((?:^|\})\s*)catch\b/,
                    lookbehind: true
                },
                {
                    pattern: /(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,
                    lookbehind: true
                } ],
            // Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444)
            'function': /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,
            'number': {
                pattern: RegExp(
                    /(^|[^\w$])/.source +
                    '(?:' +
                    (
                        // constant
                        /NaN|Infinity/.source +
                        '|' +
                        // binary integer
                        /0[bB][01]+(?:_[01]+)*n?/.source +
                        '|' +
                        // octal integer
                        /0[oO][0-7]+(?:_[0-7]+)*n?/.source +
                        '|' +
                        // hexadecimal integer
                        /0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source +
                        '|' +
                        // decimal bigint
                        /\d+(?:_\d+)*n/.source +
                        '|' +
                        // decimal number (integer or float) but no bigint
                        /(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source
                    ) +
                    ')' +
                    /(?![\w$])/.source
                ),
                lookbehind: true
            },
            'operator': /--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/
        });

        Prism.languages.javascript['class-name'][0].pattern = /(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/;

        Prism.languages.insertBefore('javascript', 'keyword', {
            'regex': {
                // eslint-disable-next-line regexp/no-dupe-characters-character-class
                pattern: /((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,
                lookbehind: true,
                greedy: true,
                inside: {
                    'regex-source': {
                        pattern: /^(\/)[\s\S]+(?=\/[a-z]*$)/,
                        lookbehind: true,
                        alias: 'language-regex',
                        inside: Prism.languages.regex
                    },
                    'regex-delimiter': /^\/|\/$/,
                    'regex-flags': /^[a-z]+$/,
                }
            },
            // This must be declared before keyword because we use "function" inside the look-forward
            'function-variable': {
                pattern: /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,
                alias: 'function'
            },
            'parameter': [
                {
                    pattern: /(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,
                    lookbehind: true,
                    inside: Prism.languages.javascript
                },
                {
                    pattern: /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,
                    lookbehind: true,
                    inside: Prism.languages.javascript
                },
                {
                    pattern: /(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,
                    lookbehind: true,
                    inside: Prism.languages.javascript
                },
                {
                    pattern: /((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,
                    lookbehind: true,
                    inside: Prism.languages.javascript
                }
            ],
            'constant': /\b[A-Z](?:[A-Z_]|\dx?)*\b/
        });

        Prism.languages.insertBefore('javascript', 'string', {
            'hashbang': {
                pattern: /^#!.*/,
                greedy: true,
                alias: 'comment'
            },
            'template-string': {
                pattern: /`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,
                greedy: true,
                inside: {
                    'template-punctuation': {
                        pattern: /^`|`$/,
                        alias: 'string'
                    },
                    'interpolation': {
                        pattern: /((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,
                        lookbehind: true,
                        inside: {
                            'interpolation-punctuation': {
                                pattern: /^\$\{|\}$/,
                                alias: 'punctuation'
                            },
                            rest: Prism.languages.javascript
                        }
                    },
                    'string': /[\s\S]+/
                }
            },
            'string-property': {
                pattern: /((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,
                lookbehind: true,
                greedy: true,
                alias: 'property'
            }
        });

        Prism.languages.insertBefore('javascript', 'operator', {
            'literal-property': {
                pattern: /((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,
                lookbehind: true,
                alias: 'property'
            },
        });

        if (Prism.languages.markup) {
            Prism.languages.markup.tag.addInlined('script', 'javascript');

            // add attribute support for all DOM events.
            // https://developer.mozilla.org/en-US/docs/Web/Events#Standard_events
            Prism.languages.markup.tag.addAttribute(
                /on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,
                'javascript'
            );
        }

        Prism.languages.js = Prism.languages.javascript;


        /* **********************************************
       Begin prism-file-highlight.js
  ********************************************** */

        (function () {

            if (typeof Prism === 'undefined' || typeof document === 'undefined') {
                return;
            }

            // https://developer.mozilla.org/en-US/docs/Web/API/Element/matches#Polyfill
            if (!Element.prototype.matches) {
                Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
            }

            var LOADING_MESSAGE = 'Loading…';
            var FAILURE_MESSAGE = function (status, message) {
                return '✖ Error ' + status + ' while fetching file: ' + message;
            };
            var FAILURE_EMPTY_MESSAGE = '✖ Error: File does not exist or is empty';

            var EXTENSIONS = {
                'js': 'javascript',
                'py': 'python',
                'rb': 'ruby',
                'ps1': 'powershell',
                'psm1': 'powershell',
                'sh': 'bash',
                'bat': 'batch',
                'h': 'c',
                'tex': 'latex'
            };

            var STATUS_ATTR = 'data-src-status';
            var STATUS_LOADING = 'loading';
            var STATUS_LOADED = 'loaded';
            var STATUS_FAILED = 'failed';

            var SELECTOR = 'pre[data-src]:not([' + STATUS_ATTR + '="' + STATUS_LOADED + '"])'
                + ':not([' + STATUS_ATTR + '="' + STATUS_LOADING + '"])';

            /**
             * Loads the given file.
             *
             * @param {string} src The URL or path of the source file to load.
             * @param {(result: string) => void} success
             * @param {(reason: string) => void} error
             */
            function loadFile(src, success, error) {
                var xhr = new XMLHttpRequest();
                xhr.open('GET', src, true);
                xhr.onreadystatechange = function () {
                    if (xhr.readyState == 4) {
                        if (xhr.status < 400 && xhr.responseText) {
                            success(xhr.responseText);
                        } else {
                            if (xhr.status >= 400) {
                                error(FAILURE_MESSAGE(xhr.status, xhr.statusText));
                            } else {
                                error(FAILURE_EMPTY_MESSAGE);
                            }
                        }
                    }
                };
                xhr.send(null);
            }

            /**
             * Parses the given range.
             *
             * This returns a range with inclusive ends.
             *
             * @param {string | null | undefined} range
             * @returns {[number, number | undefined] | undefined}
             */
            function parseRange(range) {
                var m = /^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(range || '');
                if (m) {
                    var start = Number(m[1]);
                    var comma = m[2];
                    var end = m[3];

                    if (!comma) {
                        return [start, start];
                    }
                    if (!end) {
                        return [start, undefined];
                    }
                    return [start, Number(end)];
                }
                return undefined;
            }

            Prism.hooks.add('before-highlightall', function (env) {
                env.selector += ', ' + SELECTOR;
            });

            Prism.hooks.add('before-sanity-check', function (env) {
                var pre = /** @type {HTMLPreElement} */ (env.element);
                if (pre.matches(SELECTOR)) {
                    env.code = ''; // fast-path the whole thing and go to complete

                    pre.setAttribute(STATUS_ATTR, STATUS_LOADING); // mark as loading

                    // add code element with loading message
                    var code = pre.appendChild(document.createElement('CODE'));
                    code.textContent = LOADING_MESSAGE;

                    var src = pre.getAttribute('data-src');

                    var language = env.language;
                    if (language === 'none') {
                        // the language might be 'none' because there is no language set;
                        // in this case, we want to use the extension as the language
                        var extension = (/\.(\w+)$/.exec(src) || [, 'none'])[1];
                        language = EXTENSIONS[extension] || extension;
                    }

                    // set language classes
                    Prism.util.setLanguage(code, language);
                    Prism.util.setLanguage(pre, language);

                    // preload the language
                    var autoloader = Prism.plugins.autoloader;
                    if (autoloader) {
                        autoloader.loadLanguages(language);
                    }

                    // load file
                    loadFile(
                        src,
                        function (text) {
                            // mark as loaded
                            pre.setAttribute(STATUS_ATTR, STATUS_LOADED);

                            // handle data-range
                            var range = parseRange(pre.getAttribute('data-range'));
                            if (range) {
                                var lines = text.split(/\r\n?|\n/g);

                                // the range is one-based and inclusive on both ends
                                var start = range[0];
                                var end = range[1] == null ? lines.length : range[1];

                                if (start < 0) { start += lines.length; }
                                start = Math.max(0, Math.min(start - 1, lines.length));
                                if (end < 0) { end += lines.length; }
                                end = Math.max(0, Math.min(end, lines.length));

                                text = lines.slice(start, end).join('\n');

                                // add data-start for line numbers
                                if (!pre.hasAttribute('data-start')) {
                                    pre.setAttribute('data-start', String(start + 1));
                                }
                            }

                            // highlight code
                            code.textContent = text;
                            Prism.highlightElement(code);
                        },
                        function (error) {
                            // mark as failed
                            pre.setAttribute(STATUS_ATTR, STATUS_FAILED);

                            code.textContent = error;
                        }
                    );
                }
            });

            Prism.plugins.fileHighlight = {
                /**
                 * Executes the File Highlight plugin for all matching `pre` elements under the given container.
                 *
                 * Note: Elements which are already loaded or currently loading will not be touched by this method.
                 *
                 * @param {ParentNode} [container=document]
                 */
                highlight: function highlight(container) {
                    var elements = (container || document).querySelectorAll(SELECTOR);

                    for (var i = 0, element; (element = elements[i++]);) {
                        Prism.highlightElement(element);
                    }
                }
            };

            var logged = false;
            /** @deprecated Use `Prism.plugins.fileHighlight.highlight` instead. */
            Prism.fileHighlight = function () {
                if (!logged) {
                    console.warn('Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead.');
                    logged = true;
                }
                Prism.plugins.fileHighlight.highlight.apply(this, arguments);
            };

        }());
    });

    (function (Prism) {

        /**
         * Returns the placeholder for the given language id and index.
         *
         * @param {string} language
         * @param {string|number} index
         * @returns {string}
         */
        function getPlaceholder(language, index) {
            return '___' + language.toUpperCase() + index + '___';
        }

        Object.defineProperties(Prism.languages['markup-templating'] = {}, {
            buildPlaceholders: {
                /**
                 * Tokenize all inline templating expressions matching `placeholderPattern`.
                 *
                 * If `replaceFilter` is provided, only matches of `placeholderPattern` for which `replaceFilter` returns
                 * `true` will be replaced.
                 *
                 * @param {object} env The environment of the `before-tokenize` hook.
                 * @param {string} language The language id.
                 * @param {RegExp} placeholderPattern The matches of this pattern will be replaced by placeholders.
                 * @param {(match: string) => boolean} [replaceFilter]
                 */
                value: function (env, language, placeholderPattern, replaceFilter) {
                    if (env.language !== language) {
                        return;
                    }

                    var tokenStack = env.tokenStack = [];

                    env.code = env.code.replace(placeholderPattern, function (match) {
                        if (typeof replaceFilter === 'function' && !replaceFilter(match)) {
                            return match;
                        }
                        var i = tokenStack.length;
                        var placeholder;

                        // Check for existing strings
                        while (env.code.indexOf(placeholder = getPlaceholder(language, i)) !== -1) {
                            ++i;
                        }

                        // Create a sparse array
                        tokenStack[i] = match;

                        return placeholder;
                    });

                    // Switch the grammar to markup
                    env.grammar = Prism.languages.markup;
                }
            },
            tokenizePlaceholders: {
                /**
                 * Replace placeholders with proper tokens after tokenizing.
                 *
                 * @param {object} env The environment of the `after-tokenize` hook.
                 * @param {string} language The language id.
                 */
                value: function (env, language) {
                    if (env.language !== language || !env.tokenStack) {
                        return;
                    }

                    // Switch the grammar back
                    env.grammar = Prism.languages[language];

                    var j = 0;
                    var keys = Object.keys(env.tokenStack);

                    function walkTokens(tokens) {
                        for (var i = 0; i < tokens.length; i++) {
                            // all placeholders are replaced already
                            if (j >= keys.length) {
                                break;
                            }

                            var token = tokens[i];
                            if (typeof token === 'string' || (token.content && typeof token.content === 'string')) {
                                var k = keys[j];
                                var t = env.tokenStack[k];
                                var s = typeof token === 'string' ? token : token.content;
                                var placeholder = getPlaceholder(language, k);

                                var index = s.indexOf(placeholder);
                                if (index > -1) {
                                    ++j;

                                    var before = s.substring(0, index);
                                    var middle = new Prism.Token(language, Prism.tokenize(t, env.grammar), 'language-' + language, t);
                                    var after = s.substring(index + placeholder.length);

                                    var replacement = [];
                                    if (before) {
                                        replacement.push.apply(replacement, walkTokens([before]));
                                    }
                                    replacement.push(middle);
                                    if (after) {
                                        replacement.push.apply(replacement, walkTokens([after]));
                                    }

                                    if (typeof token === 'string') {
                                        tokens.splice.apply(tokens, [i, 1].concat(replacement));
                                    } else {
                                        token.content = replacement;
                                    }
                                }
                            } else if (token.content /* && typeof token.content !== 'string' */) {
                                walkTokens(token.content);
                            }
                        }

                        return tokens;
                    }

                    walkTokens(env.tokens);
                }
            }
        });

    }(Prism));

    var highlightCodeCompiler = function (ref) {
        var renderer = ref.renderer;

        return (renderer.code = function (code, lang) {
            if ( lang === void 0 ) lang = 'markup';

            var langOrMarkup = prism.languages[lang] || prism.languages.markup;
            var text = prism.highlight(
                code.replace(/@DOCSIFY_QM@/g, '`'),
                langOrMarkup,
                lang
            );

            return ("<pre v-pre data-lang=\"" + lang + "\"><code class=\"lang-" + lang + "\">" + text + "</code></pre>");
        });
    };

    var paragraphCompiler = function (ref) {
        var renderer = ref.renderer;

        return (renderer.paragraph = function (text) {
            var result;
            if (/^!&gt;/.test(text)) {
                result = helper('tip', text);
            } else if (/^\?&gt;/.test(text)) {
                result = helper('warn', text);
            } else {
                result = "<p>" + text + "</p>";
            }

            return result;
        });
    };

    var taskListCompiler = function (ref) {
        var renderer = ref.renderer;

        return (renderer.list = function (body, ordered, start) {
            var isTaskList = /<li class="task-list-item">/.test(
                body.split('class="task-list"')[0]
            );
            var isStartReq = start && start > 1;
            var tag = ordered ? 'ol' : 'ul';
            var tagAttrs = [
                isTaskList ? 'class="task-list"' : '',
                isStartReq ? ("start=\"" + start + "\"") : '' ]
                .join(' ')
                .trim();

            return ("<" + tag + " " + tagAttrs + ">" + body + "</" + tag + ">");
        });
    };

    var taskListItemCompiler = function (ref) {
        var renderer = ref.renderer;

        return (renderer.listitem = function (text) {
            var isTaskItem = /^(<input.*type="checkbox"[^>]*>)/.test(text);
            var html = isTaskItem
                ? ("<li class=\"task-list-item\"><label>" + text + "</label></li>")
                : ("<li>" + text + "</li>");

            return html;
        });
    };

    var linkCompiler = function (ref) {
        var renderer = ref.renderer;
        var router = ref.router;
        var linkTarget = ref.linkTarget;
        var linkRel = ref.linkRel;
        var compilerClass = ref.compilerClass;

        return (renderer.link = function (href, title, text) {
            if ( title === void 0 ) title = '';

            var attrs = [];
            var ref = getAndRemoveConfig(title);
            var str = ref.str;
            var config = ref.config;
            linkTarget = config.target || linkTarget;
            linkRel =
                linkTarget === '_blank'
                    ? compilerClass.config.externalLinkRel || 'noopener'
                    : '';
            title = str;

            if (
                !isAbsolutePath(href) &&
                !compilerClass._matchNotCompileLink(href) &&
                !config.ignore
            ) {
                if (href === compilerClass.config.homepage) {
                    href = 'README';
                }

                href = router.toURL(href, null, router.getCurrentPath());
            } else {
                if (!isAbsolutePath(href) && href.slice(0, 2) === './') {
                    href =
                        document.URL.replace(/\/(?!.*\/).*/, '/').replace('#/./', '') + href;
                }
                attrs.push(href.indexOf('mailto:') === 0 ? '' : ("target=\"" + linkTarget + "\""));
                attrs.push(
                    href.indexOf('mailto:') === 0
                        ? ''
                        : linkRel !== ''
                            ? (" rel=\"" + linkRel + "\"")
                            : ''
                );
            }

            // special case to check crossorigin urls
            if (
                config.crossorgin &&
                linkTarget === '_self' &&
                compilerClass.config.routerMode === 'history'
            ) {
                if (compilerClass.config.crossOriginLinks.indexOf(href) === -1) {
                    compilerClass.config.crossOriginLinks.push(href);
                }
            }

            if (config.disabled) {
                attrs.push('disabled');
                href = 'javascript:void(0)';
            }

            if (config.class) {
                attrs.push(("class=\"" + (config.class) + "\""));
            }

            if (config.id) {
                attrs.push(("id=\"" + (config.id) + "\""));
            }

            if (title) {
                attrs.push(("title=\"" + title + "\""));
            }

            return ("<a href=\"" + href + "\" " + (attrs.join(' ')) + ">" + text + "</a>");
        });
    };

    var cachedLinks = {};

    var compileMedia = {
        markdown: function markdown(url) {
            return {
                url: url,
            };
        },
        mermaid: function mermaid(url) {
            return {
                url: url,
            };
        },
        iframe: function iframe(url, title) {
            return {
                html: ("<iframe src=\"" + url + "\" " + (title || 'width=100% height=400') + "></iframe>"),
            };
        },
        video: function video(url, title) {
            return {
                html: ("<video src=\"" + url + "\" " + (title || 'controls') + ">Not Support</video>"),
            };
        },
        audio: function audio(url, title) {
            return {
                html: ("<audio src=\"" + url + "\" " + (title || 'controls') + ">Not Support</audio>"),
            };
        },
        code: function code(url, title) {
            var lang = url.match(/\.(\w+)$/);

            lang = title || (lang && lang[1]);
            if (lang === 'md') {
                lang = 'markdown';
            }

            return {
                url: url,
                lang: lang,
            };
        },
    };

    var Compiler = function Compiler(config, router) {
        var this$1 = this;

        this.config = config;
        this.router = router;
        this.cacheTree = {};
        this.toc = [];
        this.cacheTOC = {};
        this.linkTarget = config.externalLinkTarget || '_blank';
        this.linkRel =
            this.linkTarget === '_blank' ? config.externalLinkRel || 'noopener' : '';
        this.contentBase = router.getBasePath();

        var renderer = this._initRenderer();
        this.heading = renderer.heading;
        var compile;
        var mdConf = config.markdown || {};

        if (isFn(mdConf)) {
            compile = mdConf(marked_1, renderer);
        } else {
            marked_1.setOptions(
                merge(mdConf, {
                    renderer: merge(renderer, mdConf.renderer),
                })
            );
            compile = marked_1;
        }

        this._marked = compile;
        this.compile = function (text) {
            var isCached = true;
            // eslint-disable-next-line no-unused-vars
            var result = cached(function (_) {
                isCached = false;
                var html = '';

                if (!text) {
                    return text;
                }

                if (isPrimitive(text)) {
                    html = compile(text);
                } else {
                    html = compile.parser(text);
                }

                html = config.noEmoji ? html : emojify(html, config.nativeEmoji);
                slugify.clear();

                return html;
            })(text);

            var curFileName = this$1.router.parse().file;

            if (isCached) {
                this$1.toc = this$1.cacheTOC[curFileName];
            } else {
                this$1.cacheTOC[curFileName] = [].concat( this$1.toc );
            }

            return result;
        };
    };

    /**
     * Pulls content from file and renders inline on the page as a embedded item.
     *
     * This allows you to embed different file types on the returned
     * page.
     * The basic format is:
     * ```
     * [filename](_media/example.md ':include')
     * ```
     *
     * @param {string} href The href to the file to embed in the page.
     * @param {string} titleTitle of the link used to make the embed.
     *
     * @return {type} Return value description.
     */
    Compiler.prototype.compileEmbed = function compileEmbed (href, title) {
        var ref = getAndRemoveConfig(title);
        var str = ref.str;
        var config = ref.config;
        var embed;
        title = str;

        if (config.include) {
            if (!isAbsolutePath(href)) {
                href = getPath(
                    this.contentBase,
                    getParentPath(this.router.getCurrentPath()),
                    href
                );
            }

            var media;
            if (config.type && (media = compileMedia[config.type])) {
                embed = media.call(this, href, title);
                embed.type = config.type;
            } else {
                var type = 'code';
                if (/\.(md|markdown)/.test(href)) {
                    type = 'markdown';
                } else if (/\.mmd/.test(href)) {
                    type = 'mermaid';
                } else if (/\.html?/.test(href)) {
                    type = 'iframe';
                } else if (/\.(mp4|ogg)/.test(href)) {
                    type = 'video';
                } else if (/\.mp3/.test(href)) {
                    type = 'audio';
                }

                embed = compileMedia[type].call(this, href, title);
                embed.type = type;
            }

            embed.fragment = config.fragment;

            return embed;
        }
    };

    Compiler.prototype._matchNotCompileLink = function _matchNotCompileLink (link) {
        var links = this.config.noCompileLinks || [];

        for (var i = 0; i < links.length; i++) {
            var n = links[i];
            var re = cachedLinks[n] || (cachedLinks[n] = new RegExp(("^" + n + "$")));

            if (re.test(link)) {
                return link;
            }
        }
    };

    Compiler.prototype._initRenderer = function _initRenderer () {
        var renderer = new marked_1.Renderer();
        var ref = this;
        var linkTarget = ref.linkTarget;
        var linkRel = ref.linkRel;
        var router = ref.router;
        var contentBase = ref.contentBase;
        var _self = this;
        var origin = {};

        /**
         * Render anchor tag
         * @link https://github.com/markedjs/marked#overriding-renderer-methods
         * @param {String} text Text content
         * @param {Number} level Type of heading (h<level> tag)
         * @returns {String} Heading element
         */
        origin.heading = renderer.heading = function (text, level) {
            var ref = getAndRemoveConfig(text);
            var str = ref.str;
            var config = ref.config;
            var nextToc = { level: level, title: removeAtag(str) };

            if (/<!-- {docsify-ignore} -->/g.test(str)) {
                str = str.replace('<!-- {docsify-ignore} -->', '');
                nextToc.title = removeAtag(str);
                nextToc.ignoreSubHeading = true;
            }

            if (/{docsify-ignore}/g.test(str)) {
                str = str.replace('{docsify-ignore}', '');
                nextToc.title = removeAtag(str);
                nextToc.ignoreSubHeading = true;
            }

            if (/<!-- {docsify-ignore-all} -->/g.test(str)) {
                str = str.replace('<!-- {docsify-ignore-all} -->', '');
                nextToc.title = removeAtag(str);
                nextToc.ignoreAllSubs = true;
            }

            if (/{docsify-ignore-all}/g.test(str)) {
                str = str.replace('{docsify-ignore-all}', '');
                nextToc.title = removeAtag(str);
                nextToc.ignoreAllSubs = true;
            }

            var slug = slugify(config.id || str);
            var url = router.toURL(router.getCurrentPath(), { id: slug });
            nextToc.slug = url;
            _self.toc.push(nextToc);

            return ("<h" + level + " id=\"" + slug + "\"><a href=\"" + url + "\" data-id=\"" + slug + "\" class=\"anchor\"><span>" + str + "</span></a></h" + level + ">");
        };

        origin.code = highlightCodeCompiler({ renderer: renderer });
        origin.link = linkCompiler({
            renderer: renderer,
            router: router,
            linkTarget: linkTarget,
            linkRel: linkRel,
            compilerClass: _self,
        });
        origin.paragraph = paragraphCompiler({ renderer: renderer });
        origin.image = imageCompiler({ renderer: renderer, contentBase: contentBase, router: router });
        origin.list = taskListCompiler({ renderer: renderer });
        origin.listitem = taskListItemCompiler({ renderer: renderer });

        renderer.origin = origin;

        return renderer;
    };

    /**
     * Compile sidebar
     * @param {String} text Text content
     * @param {Number} level Type of heading (h<level> tag)
     * @returns {String} Sidebar element
     */
    Compiler.prototype.sidebar = function sidebar (text, level) {
        var ref = this;
        var toc = ref.toc;
        var currentPath = this.router.getCurrentPath();
        var html = '';

        if (text) {
            html = this.compile(text);
        } else {
            for (var i = 0; i < toc.length; i++) {
                if (toc[i].ignoreSubHeading) {
                    var deletedHeaderLevel = toc[i].level;
                    toc.splice(i, 1);
                    // Remove headers who are under current header
                    for (
                        var j = i;
                        j < toc.length && deletedHeaderLevel < toc[j].level;
                        j++
                    ) {
                        toc.splice(j, 1) && j-- && i++;
                    }

                    i--;
                }
            }

            var tree$1 = this.cacheTree[currentPath] || genTree(toc, level);
            html = tree(tree$1, '<ul>{inner}</ul>');
            this.cacheTree[currentPath] = tree$1;
        }

        return html;
    };

    /**
     * Compile sub sidebar
     * @param {Number} level Type of heading (h<level> tag)
     * @returns {String} Sub-sidebar element
     */
    Compiler.prototype.subSidebar = function subSidebar (level) {
        if (!level) {
            this.toc = [];
            return;
        }

        var currentPath = this.router.getCurrentPath();
        var ref = this;
        var cacheTree = ref.cacheTree;
        var toc = ref.toc;

        toc[0] && toc[0].ignoreAllSubs && toc.splice(0);
        toc[0] && toc[0].level === 1 && toc.shift();

        for (var i = 0; i < toc.length; i++) {
            toc[i].ignoreSubHeading && toc.splice(i, 1) && i--;
        }

        var tree$1 = cacheTree[currentPath] || genTree(toc, level);

        cacheTree[currentPath] = tree$1;
        this.toc = [];
        return tree(tree$1);
    };

    Compiler.prototype.header = function header (text, level) {
        return this.heading(text, level);
    };

    Compiler.prototype.article = function article (text) {
        return this.compile(text);
    };

    /**
     * Compile cover page
     * @param {Text} text Text content
     * @returns {String} Cover page
     */
    Compiler.prototype.cover = function cover (text) {
        var cacheToc = this.toc.slice();
        var html = this.compile(text);

        this.toc = cacheToc.slice();

        return html;
    };

    var minIndent = function (string) {
        var match = string.match(/^[ \t]*(?=\S)/gm);

        if (!match) {
            return 0;
        }

        return match.reduce(function (r, a) { return Math.min(r, a.length); }, Infinity);
    };

    var stripIndent = function (string) {
        var indent = minIndent(string);

        if (indent === 0) {
            return string;
        }

        var regex = new RegExp(("^[ \\t]{" + indent + "}"), 'gm');

        return string.replace(regex, '');
    };

    var cached$2 = {};

    function walkFetchEmbed(ref, cb) {
        var embedTokens = ref.embedTokens;
        var compile = ref.compile;
        var fetch = ref.fetch;

        var token;
        var step = 0;
        var count = 1;

        if (!embedTokens.length) {
            return cb({});
        }

        while ((token = embedTokens[step++])) {
            // eslint-disable-next-line no-shadow
            var next = (function (token) {
                return function (text) {
                    var embedToken;
                    if (text) {
                        if (token.embed.type === 'markdown') {
                            var path = token.embed.url.split('/');
                            path.pop();
                            path = path.join('/');
                            // Resolves relative links to absolute
                            text = text.replace(/\[([^[\]]+)\]\(([^)]+)\)/g, function (x) {
                                var linkBeginIndex = x.indexOf('(');
                                if (x.slice(linkBeginIndex, linkBeginIndex + 2) === '(.') {
                                    return (
                                        x.substring(0, linkBeginIndex) +
                                        "(" + (window.location.protocol) + "//" + (window.location.host) + path + "/" +
                                        x.substring(linkBeginIndex + 1, x.length - 1) +
                                        ')'
                                    );
                                }
                                return x;
                            });

                            // This may contain YAML front matter and will need to be stripped.
                            var frontMatterInstalled =
                                ($docsify.frontMatter || {}).installed || false;
                            if (frontMatterInstalled === true) {
                                text = $docsify.frontMatter.parseMarkdown(text);
                            }

                            embedToken = compile.lexer(text);
                        } else if (token.embed.type === 'code') {
                            if (token.embed.fragment) {
                                var fragment = token.embed.fragment;
                                var pattern = new RegExp(
                                    ("(?:###|\\/\\/\\/)\\s*\\[" + fragment + "\\]([\\s\\S]*)(?:###|\\/\\/\\/)\\s*\\[" + fragment + "\\]")
                                );
                                text = stripIndent((text.match(pattern) || [])[1] || '').trim();
                            }

                            embedToken = compile.lexer(
                                '```' +
                                token.embed.lang +
                                '\n' +
                                text.replace(/`/g, '@DOCSIFY_QM@') +
                                '\n```\n'
                            );
                        } else if (token.embed.type === 'mermaid') {
                            embedToken = [
                                { type: 'html', text: ("<div class=\"mermaid\">\n" + text + "\n</div>") } ];
                            embedToken.links = {};
                        } else {
                            embedToken = [{ type: 'html', text: text }];
                            embedToken.links = {};
                        }
                    }

                    cb({ token: token, embedToken: embedToken });
                    if (++count >= step) {
                        cb({});
                    }
                };
            })(token);

            if (token.embed.url) {
                {
                    get(token.embed.url).then(next);
                }
            } else {
                next(token.embed.html);
            }
        }
    }

    function prerenderEmbed(ref, done) {
        var compiler = ref.compiler;
        var raw = ref.raw; if ( raw === void 0 ) raw = '';
        var fetch = ref.fetch;

        var hit = cached$2[raw];
        if (hit) {
            var copy = hit.slice();
            copy.links = hit.links;
            return done(copy);
        }

        var compile = compiler._marked;
        var tokens = compile.lexer(raw);
        var embedTokens = [];
        var linkRE = compile.Lexer.rules.inline.link;
        var links = tokens.links;

        tokens.forEach(function (token, index) {
            if (token.type === 'paragraph') {
                token.text = token.text.replace(
                    new RegExp(linkRE.source, 'g'),
                    function (src, filename, href, title) {
                        var embed = compiler.compileEmbed(href, title);

                        if (embed) {
                            embedTokens.push({
                                index: index,
                                embed: embed,
                            });
                        }

                        return src;
                    }
                );
            }
        });

        // keep track of which tokens have been embedded so far
        // so that we know where to insert the embedded tokens as they
        // are returned
        var moves = [];
        walkFetchEmbed({ compile: compile, embedTokens: embedTokens, fetch: fetch }, function (ref) {
            var embedToken = ref.embedToken;
            var token = ref.token;

            if (token) {
                // iterate through the array of previously inserted tokens
                // to determine where the current embedded tokens should be inserted
                var index = token.index;
                moves.forEach(function (pos) {
                    if (index > pos.start) {
                        index += pos.length;
                    }
                });

                merge(links, embedToken.links);

                tokens = tokens
                    .slice(0, index)
                    .concat(embedToken, tokens.slice(index + 1));
                moves.push({ start: index, length: embedToken.length - 1 });
            } else {
                cached$2[raw] = tokens.concat();
                tokens.links = cached$2[raw].links = links;
                done(tokens);
            }
        });
    }

    /* eslint-disable no-unused-vars */

    var vueGlobalData;

    function executeScript() {
        var script = findAll('.markdown-section>script')
            .filter(function (s) { return !/template/.test(s.type); })[0];
        if (!script) {
            return false;
        }

        var code = script.innerText.trim();
        if (!code) {
            return false;
        }

        new Function(code)();
    }

    function formatUpdated(html, updated, fn) {
        updated =
            typeof fn === 'function'
                ? fn(updated)
                : typeof fn === 'string'
                    ? tinydate(fn)(new Date(updated))
                    : updated;

        return html.replace(/{docsify-updated}/g, updated);
    }

    function renderMain(html) {
        var docsifyConfig = this.config;
        var markdownElm = find('.markdown-section');
        var vueVersion =
            'Vue' in window &&
            window.Vue.version &&
            Number(window.Vue.version.charAt(0));

        var isMountedVue = function (elm) {
            var isVue2 = Boolean(elm.__vue__ && elm.__vue__._isVue);
            var isVue3 = Boolean(elm._vnode && elm._vnode.__v_skip);

            return isVue2 || isVue3;
        };

        if (!html) {
            html = '<h1>404 - Not found</h1>';
        }

        if ('Vue' in window) {
            var mountedElms = findAll('.markdown-section > *')
                .filter(function (elm) { return isMountedVue(elm); });

            // Destroy/unmount existing Vue instances
            for (var i = 0, list = mountedElms; i < list.length; i += 1) {
                var mountedElm = list[i];

                if (vueVersion === 2) {
                    mountedElm.__vue__.$destroy();
                } else if (vueVersion === 3) {
                    mountedElm.__vue_app__.unmount();
                }
            }
        }

        this._renderTo(markdownElm, html);

        // Render sidebar with the TOC
        !docsifyConfig.loadSidebar && this._renderSidebar();

        // Execute markdown <script>
        if (
            docsifyConfig.executeScript ||
            ('Vue' in window && docsifyConfig.executeScript !== false)
        ) {
            executeScript();
        }

        // Handle Vue content not mounted by markdown <script>
        if ('Vue' in window) {
            var vueMountData = [];
            var vueComponentNames = Object.keys(docsifyConfig.vueComponents || {});

            // Register global vueComponents
            if (vueVersion === 2 && vueComponentNames.length) {
                vueComponentNames.forEach(function (name) {
                    var isNotRegistered = !window.Vue.options.components[name];

                    if (isNotRegistered) {
                        window.Vue.component(name, docsifyConfig.vueComponents[name]);
                    }
                });
            }

            // Store global data() return value as shared data object
            if (
                !vueGlobalData &&
                docsifyConfig.vueGlobalOptions &&
                typeof docsifyConfig.vueGlobalOptions.data === 'function'
            ) {
                vueGlobalData = docsifyConfig.vueGlobalOptions.data();
            }

            // vueMounts
            vueMountData.push.apply(
                vueMountData, Object.keys(docsifyConfig.vueMounts || {})
                    .map(function (cssSelector) { return [
                        find(markdownElm, cssSelector),
                        docsifyConfig.vueMounts[cssSelector] ]; })
                    .filter(function (ref) {
                        var elm = ref[0];
                        var vueConfig = ref[1];

                        return elm;
                    })
            );

            // Template syntax, vueComponents, vueGlobalOptions
            if (docsifyConfig.vueGlobalOptions || vueComponentNames.length) {
                var reHasBraces = /{{2}[^{}]*}{2}/;
                // Matches Vue full and shorthand syntax as attributes in HTML tags.
                //
                // Full syntax examples:
                // v-foo, v-foo[bar], v-foo-bar, v-foo:bar-baz.prop
                //
                // Shorthand syntax examples:
                // @foo, @foo.bar, @foo.bar.baz, @[foo], :foo, :[foo]
                //
                // Markup examples:
                // <div v-html>{{ html }}</div>
                // <div v-text="msg"></div>
                // <div v-bind:text-content.prop="text">
                // <button v-on:click="doThis"></button>
                // <button v-on:click.once="doThis"></button>
                // <button v-on:[event]="doThis"></button>
                // <button @click.stop.prevent="doThis">
                // <a :href="url">
                // <a :[key]="url">
                var reHasDirective = /<[^>/]+\s([@:]|v-)[\w-:.[\]]+[=>\s]/;

                vueMountData.push.apply(
                    vueMountData, findAll('.markdown-section > *')
                        // Remove duplicates
                        .filter(function (elm) { return !vueMountData.some(function (ref) {
                            var e = ref[0];
                            var c = ref[1];

                            return e === elm;
                        }); })
                        // Detect Vue content
                        .filter(function (elm) {
                            var isVueMount =
                                // is a component
                                elm.tagName.toLowerCase() in
                                (docsifyConfig.vueComponents || {}) ||
                                // has a component(s)
                                elm.querySelector(vueComponentNames.join(',') || null) ||
                                // has curly braces
                                reHasBraces.test(elm.outerHTML) ||
                                // has content directive
                                reHasDirective.test(elm.outerHTML);

                            return isVueMount;
                        })
                        .map(function (elm) {
                            // Clone global configuration
                            var vueConfig = merge({}, docsifyConfig.vueGlobalOptions || {});

                            // Replace vueGlobalOptions data() return value with shared data object.
                            // This provides a global store for all Vue instances that receive
                            // vueGlobalOptions as their configuration.
                            if (vueGlobalData) {
                                vueConfig.data = function () {
                                    return vueGlobalData;
                                };
                            }

                            return [elm, vueConfig];
                        })
                );
            }

            // Mount
            for (var i$1 = 0, list$1 = vueMountData; i$1 < list$1.length; i$1 += 1) {
                var ref = list$1[i$1];
                var mountElm = ref[0];
                var vueConfig = ref[1];

                var isVueAttr = 'data-isvue';
                var isSkipElm =
                    // Is an invalid tag
                    mountElm.matches('pre, script') ||
                    // Is a mounted instance
                    isMountedVue(mountElm) ||
                    // Has mounted instance(s)
                    mountElm.querySelector(("[" + isVueAttr + "]"));

                if (!isSkipElm) {
                    mountElm.setAttribute(isVueAttr, '');

                    if (vueVersion === 2) {
                        vueConfig.el = undefined;
                        new window.Vue(vueConfig).$mount(mountElm);
                    } else if (vueVersion === 3) {
                        var app = window.Vue.createApp(vueConfig);

                        // Register global vueComponents
                        vueComponentNames.forEach(function (name) {
                            var config = docsifyConfig.vueComponents[name];

                            app.component(name, config);
                        });

                        app.mount(mountElm);
                    }
                }
            }
        }
    }

    function renderNameLink(vm) {
        var el = getNode('.app-name-link');
        var nameLink = vm.config.nameLink;
        var path = vm.route.path;

        if (!el) {
            return;
        }

        if (isPrimitive(vm.config.nameLink)) {
            el.setAttribute('href', nameLink);
        } else if (typeof nameLink === 'object') {
            var match = Object.keys(nameLink).filter(
                function (key) { return path.indexOf(key) > -1; }
            )[0];

            el.setAttribute('href', nameLink[match]);
        }
    }

    /** @typedef {import('../Docsify').Constructor} Constructor */

    /**
     * @template {!Constructor} T
     * @param {T} Base - The class to extend
     */
    function Render(Base) {
        return /*@__PURE__*/(function (Base) {
            function Render () {
                Base.apply(this, arguments);
            }

            if ( Base ) Render.__proto__ = Base;
            Render.prototype = Object.create( Base && Base.prototype );
            Render.prototype.constructor = Render;

            Render.prototype._renderTo = function _renderTo (el, content, replace) {
                var node = getNode(el);
                if (node) {
                    node[replace ? 'outerHTML' : 'innerHTML'] = content;
                }
            };

            Render.prototype._renderSidebar = function _renderSidebar (text) {
                var ref = this.config;
                var maxLevel = ref.maxLevel;
                var subMaxLevel = ref.subMaxLevel;
                var loadSidebar = ref.loadSidebar;
                var hideSidebar = ref.hideSidebar;

                if (hideSidebar) {
                    // FIXME : better styling solution
                    [
                        document.querySelector('aside.sidebar'),
                        document.querySelector('button.sidebar-toggle') ]
                        .filter(function (e) { return !!e; })
                        .forEach(function (node) { return node.parentNode.removeChild(node); });
                    document.querySelector('section.content').style.right = 'unset';
                    document.querySelector('section.content').style.left = 'unset';
                    document.querySelector('section.content').style.position = 'relative';
                    document.querySelector('section.content').style.width = '100%';
                    return null;
                }

                this._renderTo('.sidebar-nav', this.compiler.sidebar(text, maxLevel));
                var activeEl = getAndActive(this.router, '.sidebar-nav', true, true);
                if (loadSidebar && activeEl) {
                    activeEl.parentNode.innerHTML +=
                        this.compiler.subSidebar(subMaxLevel) || '';
                } else {
                    // Reset toc
                    this.compiler.subSidebar();
                }

                // Bind event
                this._bindEventOnRendered(activeEl);
            };

            Render.prototype._bindEventOnRendered = function _bindEventOnRendered (activeEl) {
                var ref = this.config;
                var autoHeader = ref.autoHeader;

                scrollActiveSidebar(this.router);

                if (autoHeader && activeEl) {
                    var main = getNode('#main');
                    var firstNode = main.children[0];
                    if (firstNode && firstNode.tagName !== 'H1') {
                        var h1 = this.compiler.header(activeEl.innerText, 1);
                        var wrapper = create('div', h1);
                        before(main, wrapper.children[0]);
                    }
                }
            };

            Render.prototype._renderNav = function _renderNav (text) {
                text && this._renderTo('nav', this.compiler.compile(text));
                if (this.config.loadNavbar) {
                    getAndActive(this.router, 'nav');
                }
            };

            Render.prototype._renderMain = function _renderMain (text, opt, next) {
                var this$1 = this;
                if ( opt === void 0 ) opt = {};

                if (!text) {
                    return renderMain.call(this, text);
                }

                this.callHook('beforeEach', text, function (result) {
                    var html;
                    var callback = function () {
                        if (opt.updatedAt) {
                            html = formatUpdated(
                                html,
                                opt.updatedAt,
                                this$1.config.formatUpdated
                            );
                        }

                        this$1.callHook('afterEach', html, function (hookData) {
                            renderMain.call(this$1, hookData);
                            next();
                        });
                    };

                    if (this$1.isHTML) {
                        html = this$1.result = text;
                        callback();
                    } else {
                        prerenderEmbed(
                            {
                                compiler: this$1.compiler,
                                raw: result,
                            },
                            function (tokens) {
                                html = this$1.compiler.compile(tokens);
                                callback();
                            }
                        );
                    }
                });
            };

            Render.prototype._renderCover = function _renderCover (text, coverOnly) {
                var el = getNode('.cover');

                toggleClass(
                    getNode('main'),
                    coverOnly ? 'add' : 'remove',
                    'hidden'
                );
                if (!text) {
                    toggleClass(el, 'remove', 'show');
                    return;
                }

                toggleClass(el, 'add', 'show');

                var html = this.coverIsHTML ? text : this.compiler.cover(text);

                var m = html
                    .trim()
                    .match('<p><img.*?data-origin="(.*?)"[^a]+alt="(.*?)">([^<]*?)</p>$');

                if (m) {
                    if (m[2] === 'color') {
                        el.style.background = m[1] + (m[3] || '');
                    } else {
                        var path = m[1];

                        toggleClass(el, 'add', 'has-mask');
                        if (!isAbsolutePath(m[1])) {
                            path = getPath(this.router.getBasePath(), m[1]);
                        }

                        el.style.backgroundImage = "url(" + path + ")";
                        el.style.backgroundSize = 'cover';
                        el.style.backgroundPosition = 'center center';
                    }

                    html = html.replace(m[0], '');
                }

                this._renderTo('.cover-main', html);
                sticky();
            };

            Render.prototype._updateRender = function _updateRender () {
                // Render name link
                renderNameLink(this);
            };

            Render.prototype.initRender = function initRender () {
                var config = this.config;

                // Init markdown compiler
                this.compiler = new Compiler(config, this.router);
                {
                    /* eslint-disable-next-line camelcase */
                    window.__current_docsify_compiler__ = this.compiler;
                }

                var id = config.el || '#app';
                var navEl = find('nav') || create('nav');

                var el = find(id);
                var html = '';
                var navAppendToTarget = body;

                if (el) {
                    if (config.repo) {
                        html += corner(config.repo, config.cornerExternalLinkTarget);
                    }

                    if (config.coverpage) {
                        html += cover();
                    }

                    if (config.logo) {
                        var isBase64 = /^data:image/.test(config.logo);
                        var isExternal = /(?:http[s]?:)?\/\//.test(config.logo);
                        var isRelative = /^\./.test(config.logo);

                        if (!isBase64 && !isExternal && !isRelative) {
                            config.logo = getPath(this.router.getBasePath(), config.logo);
                        }
                    }

                    html += main(config);
                    // Render main app
                    this._renderTo(el, html, true);
                } else {
                    this.rendered = true;
                }

                if (config.mergeNavbar && isMobile) {
                    navAppendToTarget = find('.sidebar');
                } else {
                    navEl.classList.add('app-nav');

                    if (!config.repo) {
                        navEl.classList.add('no-badge');
                    }
                }

                // Add nav
                if (config.loadNavbar) {
                    before(navAppendToTarget, navEl);
                }

                if (config.themeColor) {
                    $.head.appendChild(
                        create('div', theme(config.themeColor)).firstElementChild
                    );
                    // Polyfll
                    cssVars(config.themeColor);
                }

                this._updateRender();
                toggleClass(body, 'ready');
            };

            return Render;
        }(Base));
    }

    /* eslint-disable no-unused-vars */

    function loadNested(path, qs, file, next, vm, first) {
        path = first ? path : path.replace(/\/$/, '');
        path = getParentPath(path);

        if (!path) {
            return;
        }

        get(
            vm.router.getFile(path + file) + qs,
            false,
            vm.config.requestHeaders
        ).then(next, function (_) { return loadNested(path, qs, file, next, vm); });
    }

    /** @typedef {import('../Docsify').Constructor} Constructor */

    /**
     * @template {!Constructor} T
     * @param {T} Base - The class to extend
     */
    function Fetch(Base) {
        var last;

        var abort = function () { return last && last.abort && last.abort(); };
        var request = function (url, hasbar, requestHeaders) {
            abort();
            last = get(url, true, requestHeaders);
            return last;
        };

        var get404Path = function (path, config) {
            var notFoundPage = config.notFoundPage;
            var ext = config.ext;
            var defaultPath = '_404' + (ext || '.md');
            var key;
            var path404;

            switch (typeof notFoundPage) {
                case 'boolean':
                    path404 = defaultPath;
                    break;
                case 'string':
                    path404 = notFoundPage;
                    break;

                case 'object':
                    key = Object.keys(notFoundPage)
                        .sort(function (a, b) { return b.length - a.length; })
                        .filter(function (k) { return path.match(new RegExp('^' + k)); })[0];

                    path404 = (key && notFoundPage[key]) || defaultPath;
                    break;
            }

            return path404;
        };

        return /*@__PURE__*/(function (Base) {
            function Fetch () {
                Base.apply(this, arguments);
            }

            if ( Base ) Fetch.__proto__ = Base;
            Fetch.prototype = Object.create( Base && Base.prototype );
            Fetch.prototype.constructor = Fetch;

            Fetch.prototype._loadSideAndNav = function _loadSideAndNav (path, qs, loadSidebar, cb) {
                var this$1 = this;

                return function () {
                    if (!loadSidebar) {
                        return cb();
                    }

                    var fn = function (result) {
                        this$1._renderSidebar(result);
                        cb();
                    };

                    // Load sidebar
                    loadNested(path, qs, loadSidebar, fn, this$1, true);
                };
            };

            Fetch.prototype._fetch = function _fetch (cb) {
                var this$1 = this;
                if ( cb === void 0 ) cb = noop;

                var ref = this.route;
                var query = ref.query;
                var ref$1 = this.route;
                var path = ref$1.path;

                // Prevent loading remote content via URL hash
                // Ex: https://foo.com/#//bar.com/file.md
                if (isExternal(path)) {
                    history.replaceState(null, '', '#');
                    this.router.normalize();
                } else {
                    var qs = stringifyQuery(query, ['id']);
                    var ref$2 = this.config;
                    var loadNavbar = ref$2.loadNavbar;
                    var requestHeaders = ref$2.requestHeaders;
                    var loadSidebar = ref$2.loadSidebar;
                    // Abort last request

                    var file = this.router.getFile(path);

                    this.isRemoteUrl = isExternal(file);
                    // Current page is html
                    this.isHTML = /\.html$/g.test(file);

                    // create a handler that should be called if content was fetched successfully
                    var contentFetched = function (text, opt) {
                        this$1._renderMain(
                            text,
                            opt,
                            this$1._loadSideAndNav(path, qs, loadSidebar, cb)
                        );
                    };

                    // and a handler that is called if content failed to fetch
                    var contentFailedToFetch = function (_) {
                        this$1._fetchFallbackPage(path, qs, cb) || this$1._fetch404(file, qs, cb);
                    };

                    // attempt to fetch content from a virtual route, and fallback to fetching the actual file
                    if (!this.isRemoteUrl) {
                        this.matchVirtualRoute(path).then(function (contents) {
                            if (typeof contents === 'string') {
                                contentFetched(contents);
                            } else {
                                request(file + qs, true, requestHeaders).then(
                                    contentFetched,
                                    contentFailedToFetch
                                );
                            }
                        });
                    } else {
                        // if the requested url is not local, just fetch the file
                        request(file + qs, true, requestHeaders).then(
                            contentFetched,
                            contentFailedToFetch
                        );
                    }

                    // Load nav
                    loadNavbar &&
                    loadNested(
                        path,
                        qs,
                        loadNavbar,
                        function (text) { return this$1._renderNav(text); },
                        this,
                        true
                    );
                }
            };

            Fetch.prototype._fetchCover = function _fetchCover () {
                var this$1 = this;

                var ref = this.config;
                var coverpage = ref.coverpage;
                var requestHeaders = ref.requestHeaders;
                var query = this.route.query;
                var root = getParentPath(this.route.path);

                if (coverpage) {
                    var path = null;
                    var routePath = this.route.path;
                    if (typeof coverpage === 'string') {
                        if (routePath === '/') {
                            path = coverpage;
                        }
                    } else if (Array.isArray(coverpage)) {
                        path = coverpage.indexOf(routePath) > -1 && '_coverpage';
                    } else {
                        var cover = coverpage[routePath];
                        path = cover === true ? '_coverpage' : cover;
                    }

                    var coverOnly = Boolean(path) && this.config.onlyCover;
                    if (path) {
                        path = this.router.getFile(root + path);
                        this.coverIsHTML = /\.html$/g.test(path);
                        get(path + stringifyQuery(query, ['id']), false, requestHeaders).then(
                            function (text) { return this$1._renderCover(text, coverOnly); }
                        );
                    } else {
                        this._renderCover(null, coverOnly);
                    }

                    return coverOnly;
                }
            };

            Fetch.prototype.$fetch = function $fetch (cb, $resetEvents) {
                var this$1 = this;
                if ( cb === void 0 ) cb = noop;
                if ( $resetEvents === void 0 ) $resetEvents = this.$resetEvents.bind(this);

                var done = function () {
                    this$1.callHook('doneEach');
                    cb();
                };

                var onlyCover = this._fetchCover();

                if (onlyCover) {
                    done();
                } else {
                    this._fetch(function () {
                        $resetEvents();
                        done();
                    });
                }
            };

            Fetch.prototype._fetchFallbackPage = function _fetchFallbackPage (path, qs, cb) {
                var this$1 = this;
                if ( cb === void 0 ) cb = noop;

                var ref = this.config;
                var requestHeaders = ref.requestHeaders;
                var fallbackLanguages = ref.fallbackLanguages;
                var loadSidebar = ref.loadSidebar;

                if (!fallbackLanguages) {
                    return false;
                }

                var local = path.split('/')[1];

                if (fallbackLanguages.indexOf(local) === -1) {
                    return false;
                }

                var newPath = this.router.getFile(
                    path.replace(new RegExp(("^/" + local)), '')
                );
                var req = request(newPath + qs, true, requestHeaders);

                req.then(
                    function (text, opt) { return this$1._renderMain(
                        text,
                        opt,
                        this$1._loadSideAndNav(path, qs, loadSidebar, cb)
                    ); },
                    function () { return this$1._fetch404(path, qs, cb); }
                );

                return true;
            };

            /**
             * Load the 404 page
             * @param {String} path URL to be loaded
             * @param {*} qs TODO: define
             * @param {Function} cb Callback
             * @returns {Boolean} True if the requested page is not found
             * @private
             */
            Fetch.prototype._fetch404 = function _fetch404 (path, qs, cb) {
                var this$1 = this;
                if ( cb === void 0 ) cb = noop;

                var ref = this.config;
                var loadSidebar = ref.loadSidebar;
                var requestHeaders = ref.requestHeaders;
                var notFoundPage = ref.notFoundPage;

                var fnLoadSideAndNav = this._loadSideAndNav(path, qs, loadSidebar, cb);
                if (notFoundPage) {
                    var path404 = get404Path(path, this.config);

                    request(this.router.getFile(path404), true, requestHeaders).then(
                        function (text, opt) { return this$1._renderMain(text, opt, fnLoadSideAndNav); },
                        function () { return this$1._renderMain(null, {}, fnLoadSideAndNav); }
                    );
                    return true;
                }

                this._renderMain(null, {}, fnLoadSideAndNav);
                return false;
            };

            Fetch.prototype.initFetch = function initFetch () {
                var this$1 = this;

                var ref = this.config;
                var loadSidebar = ref.loadSidebar;

                // Server-Side Rendering
                if (this.rendered) {
                    var activeEl = getAndActive(this.router, '.sidebar-nav', true, true);
                    if (loadSidebar && activeEl) {
                        activeEl.parentNode.innerHTML += window.__SUB_SIDEBAR__;
                    }

                    this._bindEventOnRendered(activeEl);
                    this.$resetEvents();
                    this.callHook('doneEach');
                    this.callHook('ready');
                } else {
                    this.$fetch(function (_) { return this$1.callHook('ready'); });
                }
            };

            return Fetch;
        }(Base));
    }

    /** @typedef {import('../Docsify').Constructor} Constructor */

    /**
     * @template {!Constructor} T
     * @param {T} Base - The class to extend
     */
    function Events(Base) {
        return /*@__PURE__*/(function (Base) {
            function Events () {
                Base.apply(this, arguments);
            }

            if ( Base ) Events.__proto__ = Base;
            Events.prototype = Object.create( Base && Base.prototype );
            Events.prototype.constructor = Events;

            Events.prototype.$resetEvents = function $resetEvents (source) {
                var this$1 = this;

                var ref = this.config;
                var auto2top = ref.auto2top;

                (function () {
                    // Rely on the browser's scroll auto-restoration when going back or forward
                    if (source === 'history') {
                        return;
                    }
                    // Scroll to ID if specified
                    if (this$1.route.query.id) {
                        scrollIntoView(this$1.route.path, this$1.route.query.id);
                    }
                    // Scroll to top if a link was clicked and auto2top is enabled
                    if (source === 'navigate') {
                        auto2top && scroll2Top(auto2top);
                    }
                })();

                if (this.config.loadNavbar) {
                    getAndActive(this.router, 'nav');
                }
            };

            Events.prototype.initEvent = function initEvent () {
                // Bind toggle button
                btn('button.sidebar-toggle', this.router);
                collapse('.sidebar', this.router);
                // Bind sticky effect
                if (this.config.coverpage) {
                    !isMobile && on('scroll', sticky);
                } else {
                    body.classList.add('sticky');
                }
            };

            return Events;
        }(Base));
    }

    /**
     * Adds beginning of input (^) and end of input ($) assertions if needed into a regex string
     * @param {string} matcher the string to match
     * @returns {string}
     */
    function makeExactMatcher(matcher) {
        var matcherWithBeginningOfInput = startsWith(matcher, '^')
            ? matcher
            : ("^" + matcher);

        var matcherWithBeginningAndEndOfInput = endsWith(
            matcherWithBeginningOfInput,
            '$'
        )
            ? matcherWithBeginningOfInput
            : (matcherWithBeginningOfInput + "$");

        return matcherWithBeginningAndEndOfInput;
    }

    /** @typedef {((value: any) => void) => void} OnNext */
    /** @typedef {(value: any) => void} NextFunction */

    /**
     * Creates a pair of a function and an event emitter.
     * When the function is called, the event emitter calls the given callback with the value that was passed to the function.
     * @returns {[NextFunction, OnNext]}
     */
    function createNextFunction() {
        var storedCb = function () { return null; };

        function next(value) {
            storedCb(value);
        }

        function onNext(cb) {
            storedCb = cb;
        }

        return [next, onNext];
    }

    /** @typedef {import('../Docsify').Constructor} Constructor */

    /** @typedef {Record<string, string | VirtualRouteHandler>} VirtualRoutesMap */
    /** @typedef {(route: string, match: RegExpMatchArray | null) => string | void | Promise<string | void> } VirtualRouteHandler */

    /**
     * @template {!Constructor} T
     * @param {T} Base - The class to extend
     */
    function VirtualRoutes(Base) {
        return /*@__PURE__*/(function (Base) {
            function VirtualRoutes () {
                Base.apply(this, arguments);
            }

            if ( Base ) VirtualRoutes.__proto__ = Base;
            VirtualRoutes.prototype = Object.create( Base && Base.prototype );
            VirtualRoutes.prototype.constructor = VirtualRoutes;

            VirtualRoutes.prototype.routes = function routes () {
                return this.config.routes || {};
            };

            /**
             * Attempts to match the given path with a virtual route.
             * @param {string} path the path of the route to match
             * @returns {Promise<string | null>} resolves to string if route was matched, otherwise null
             */
            VirtualRoutes.prototype.matchVirtualRoute = function matchVirtualRoute (path) {
                var virtualRoutes = this.routes();
                var virtualRoutePaths = Object.keys(virtualRoutes);

                var done = function () { return null; };

                /**
                 * This is a tail recursion that iterates over all the available routes.
                 * It can result in one of two ways:
                 * 1. Call itself (essentially reviewing the next route)
                 * 2. Call the "done" callback with the result (either the contents, or "null" if no match was found)
                 */
                function asyncMatchNextRoute() {
                    var virtualRoutePath = virtualRoutePaths.shift();
                    if (!virtualRoutePath) {
                        return done(null);
                    }

                    var matcher = makeExactMatcher(virtualRoutePath);
                    var matched = path.match(matcher);

                    if (!matched) {
                        return asyncMatchNextRoute();
                    }

                    var virtualRouteContentOrFn = virtualRoutes[virtualRoutePath];

                    if (typeof virtualRouteContentOrFn === 'string') {
                        var contents = virtualRouteContentOrFn;
                        return done(contents);
                    }

                    if (typeof virtualRouteContentOrFn === 'function') {
                        var fn = virtualRouteContentOrFn;

                        var ref = createNextFunction();
                        var next = ref[0];
                        var onNext = ref[1];
                        onNext(function (contents) {
                            if (typeof contents === 'string') {
                                return done(contents);
                            } else if (contents === false) {
                                return done(null);
                            } else {
                                return asyncMatchNextRoute();
                            }
                        });

                        if (fn.length <= 2) {
                            var returnedValue = fn(path, matched);
                            return next(returnedValue);
                        } else {
                            return fn(path, matched, next);
                        }
                    }

                    return asyncMatchNextRoute();
                }

                return {
                    then: function (cb) {
                        done = cb;
                        asyncMatchNextRoute();
                    },
                };
            };

            return VirtualRoutes;
        }(Base));
    }



    var util = /*#__PURE__*/Object.freeze({
        __proto__: null,
        cached: cached,
        hyphenate: hyphenate,
        hasOwn: hasOwn,
        merge: merge,
        isPrimitive: isPrimitive,
        noop: noop,
        isFn: isFn,
        isExternal: isExternal,
        inBrowser: inBrowser,
        isMobile: isMobile,
        supportsPushState: supportsPushState,
        parseQuery: parseQuery,
        stringifyQuery: stringifyQuery,
        isAbsolutePath: isAbsolutePath,
        removeParams: removeParams,
        getParentPath: getParentPath,
        cleanPath: cleanPath,
        resolvePath: resolvePath,
        getPath: getPath,
        replaceSlug: replaceSlug
    });

    // TODO This is deprecated, kept for backwards compatibility. Remove in next
    // major release. We'll tell people to get everything from the DOCSIFY global
    // when using the global build, but we'll highly recommend for them to import
    // from the ESM build (f.e. lib/docsify.esm.js and lib/docsify.min.esm.js).
    function initGlobalAPI () {
        window.Docsify = {
            util: util,
            dom: dom,
            get: get,
            slugify: slugify,
            version: '4.13.0',
        };
        window.DocsifyCompiler = Compiler;
        window.marked = marked_1;
        window.Prism = prism;
    }

    /** @typedef {import('../Docsify').Constructor} Constructor */

    /**
     * @template {!Constructor} T
     * @param {T} Base - The class to extend
     */
    function Lifecycle(Base) {
        return /*@__PURE__*/(function (Base) {
            function Lifecycle () {
                Base.apply(this, arguments);
            }

            if ( Base ) Lifecycle.__proto__ = Base;
            Lifecycle.prototype = Object.create( Base && Base.prototype );
            Lifecycle.prototype.constructor = Lifecycle;

            Lifecycle.prototype.initLifecycle = function initLifecycle () {
                var this$1 = this;

                var hooks = [
                    'init',
                    'mounted',
                    'beforeEach',
                    'afterEach',
                    'doneEach',
                    'ready' ];

                this._hooks = {};
                this._lifecycle = {};

                hooks.forEach(function (hook) {
                    var arr = (this$1._hooks[hook] = []);
                    this$1._lifecycle[hook] = function (fn) { return arr.push(fn); };
                });
            };

            Lifecycle.prototype.callHook = function callHook (hookName, data, next) {
                if ( next === void 0 ) next = noop;

                var queue = this._hooks[hookName];
                var catchPluginErrors = this.config.catchPluginErrors;

                var step = function (index) {
                    var hookFn = queue[index];

                    if (index >= queue.length) {
                        next(data);
                    } else if (typeof hookFn === 'function') {
                        var errTitle = 'Docsify plugin error';

                        if (hookFn.length === 2) {
                            try {
                                hookFn(data, function (result) {
                                    data = result;
                                    step(index + 1);
                                });
                            } catch (err) {
                                if (catchPluginErrors) {
                                    console.error(errTitle, err);
                                } else {
                                    throw err;
                                }

                                step(index + 1);
                            }
                        } else {
                            try {
                                var result = hookFn(data);

                                data = result === undefined ? data : result;
                                step(index + 1);
                            } catch (err) {
                                if (catchPluginErrors) {
                                    console.error(errTitle, err);
                                } else {
                                    throw err;
                                }

                                step(index + 1);
                            }
                        }
                    } else {
                        step(index + 1);
                    }
                };

                step(0);
            };

            return Lifecycle;
        }(Base));
    }

    /** @typedef {new (...args: any[]) => any} Constructor */

        // eslint-disable-next-line new-cap
    var Docsify = /*@__PURE__*/(function (superclass) {
            function Docsify() {
                superclass.call(this);

                this.config = config(this);

                this.initLifecycle(); // Init hooks
                this.initPlugin(); // Install plugins
                this.callHook('init');
                this.initRouter(); // Add router
                this.initRender(); // Render base DOM
                this.initEvent(); // Bind events
                this.initFetch(); // Fetch data
                this.callHook('mounted');
            }

            if ( superclass ) Docsify.__proto__ = superclass;
            Docsify.prototype = Object.create( superclass && superclass.prototype );
            Docsify.prototype.constructor = Docsify;

            Docsify.prototype.initPlugin = function initPlugin () {
                var this$1 = this;

                [].concat(this.config.plugins).forEach(function (fn) {
                    try {
                        isFn(fn) && fn(this$1._lifecycle, this$1);
                    } catch (err) {
                        if (this$1.config.catchPluginErrors) {
                            var errTitle = 'Docsify plugin error';
                            console.error(errTitle, err);
                        } else {
                            throw err;
                        }
                    }
                });
            };

            return Docsify;
        }(Fetch(
            // eslint-disable-next-line new-cap
            Events(Render(VirtualRoutes(Router(Lifecycle(Object)))))
        )));

    /**
     * Global API
     */
    initGlobalAPI();

    /**
     * Run Docsify
     */
    // eslint-disable-next-line no-unused-vars
    documentReady(function (_) { return new Docsify(); });

}());